0

I'm using Prism 4 with Silverlight and I want to use ItemsControl to host multiple views. I really want all the views to be wrapped inside a specified ItemTemplate or be able to specify an ItemStyle so that I can use something like the Expander control in the Silverlight Toolkit . When I try to specify an ItemTemplate an unhandled System.NotSupportedException is thrown at runtime.

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)

Code

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

1 に答える 1

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 に基づいているため、最近変更された可能性があります。

お役に立てれば

ミゲル

于 2012-01-27T08:29:52.240 に答える