2012-01-18 55 views
0

我在Silverlight中使用Prism 4,我想使用ItemsControl来托管多个视图。我真的希望将所有视图都包装在指定的ItemTemplate中,或者能够指定ItemStyle,以便我可以使用类似Silverlight Toolkit中的Expander控件的东西。当我尝试指定ItemTemplate时,会在运行时引发未处理的System.NotSupportedException。是否有类似于TabControlRegionAdapter.ItemContainerStyle ItemsControl的附加属性?

ItemsControl.Items must not be a UIElement type when an ItemTemplate is set. 
    at System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.GetContainerForItem(Object item, DependencyObject recycledContainer) 
    at System.Windows.Controls.ItemContainerGenerator.Generator.GenerateNext(Boolean stopAtRealized, Boolean& isNewlyRealized) 
    at System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.GenerateNext(Boolean& isNewlyRealized) 
    at System.Windows.Controls.ItemsControl.AddContainers() 
    at System.Windows.Controls.ItemsControl.RecreateVisualChildren(IntPtr unmanagedObj) 

代码

<ItemsControl Regions:RegionManager.RegionName="DetailsRegion"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="Red" BorderThickness="1"> 
       <ContentPresenter Content="{Binding}"/> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
+0

你是如何设置的ItemsSource?基于异常,它听起来像你显式地将项目添加到项目控件(itemsControl.itemsControl.Items.Add()),而不是设置ItemsSource,通常通过绑定或您可以通过Codebehind(itemscontrol.ItemsSource =我的收藏)。 – 2012-01-22 09:32:54

+0

我没有在Xaml中设置ItemsSource。我在Prism4中使用默认的ItemsControlRegionAdapter。它将void Adapt(IRegion region,ItemsControl regionTarget)中的ItemsSource设置为:regionTarget.ItemsSource = region.Views。 region.Views是IViewsCollection:IEnumerable ,INotifyCollectionChanged。这里没有什么太疯狂的... – JJS 2012-01-23 18:39:07

+0

你知道收集什么吗?我认为这可能是问题,因为SL知道它已经是一个可能只是尝试渲染它的元素,而不是将它用作DataTemplate的DataContext。 – 2012-01-26 12:28:43

回答

0

它已经有一段时间,因为我用PRISM,但以下是你可以用它添加到集合之前实现一个包装元素自定义的iregion为例。

public class RegionWrapper : Region 
{ 
    public override Microsoft.Practices.Composite.Regions.IRegionManager Add(object view, string viewName, bool createRegionManagerScope) 
    { 
     var myWrapper = new Wrapper(); 
     myWrapper.Content = view; 
     return base.Add(myWrapper, viewName, createRegionManagerScope); 
    } 
} 

要注册这个项目,你需要创建一个地区的工厂,其中在PRISM他们然后调用适配器

public class RegionWrapperAdapter : RegionAdapterBase<IRegionAdapter> 
{ 
    protected override Microsoft.Practices.Composite.Regions.IRegion CreateRegion() 
    { 
     return new RegionWrapper(); 
    } 
} 

您引导刚注册您的适配器

protected override RegionAdapterMappings ConfigureRegionAdapterMappings() 
    { 
     var regionAdapterMappings = base.ConfigureRegionAdapterMappings(); 
     regionAdapterMappings.RegisterMapping(typeof(ItemsControl), Container.Resolve<RegionWrapperAdapter>()); 
     return regionAdapterMappings; 
    } 

当然剩下的部分是实现控制'包装',所以你可以创建该类并添加内容。它可能只是一个ContentControl,其风格类似于此示例中的特定风格,或添加任何更有趣的内容。

此代码基于PRISM的旧版本,因此最近可能发生了变化。

希望这有助于

米格尔

+0

感谢您的答案@Miguel Madero。我会试试这个并回复你。 – JJS 2012-01-27 15:31:08