是否有类似于TabControlRegionAdapter.ItemContainerStyle ItemsControl的附加属性?

时间:2012-01-18 10:14:41

标签: silverlight-4.0 prism-4

我在Silverlight中使用Prism 4,我想使用ItemsControl来托管多个视图。我真的希望所有视图都包含在指定的ItemTemplate中,或者能够指定ItemStyle,以便我可以在Silverlight Toolkit中使用类似Expander控件的东西。当我尝试指定ItemTemplate时,在运行时抛出未处理的System.NotSupportedException。

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>

1 个答案:

答案 0 :(得分: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();
    }
}

然后在你的Bootstrap上注册你的适配器

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

当然剩下的另一部分是实现控件'Wrapper',这样你就可以创建该类并添加内容。它可能只是一个ContentControl,具有与您在此示例中所具有的类似的特定样式或添加任何更高级的东西。

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

希望这有帮助

米格尔

相关问题