2012-01-18 9 views
0

私はSilverlightでPrism 4を使用していますが、ItemsControlを使用して複数のビューをホストしたいと考えています。すべてのビューを指定されたItemTemplateの中にラップするか、ItemStyleを指定できるようにして、Silverlight ToolkitのExpanderコントロールのようなものを使用できるようにします。 ItemTemplateを指定しようとすると、未処理のSystem.NotSupportedExceptionが実行時にスローされます。ItemsControlのTabControlRegionAdapter.ItemContainerStyle Attachedプロパティに似た何かがありますか?

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を設定するのに役立ちますか?例外に基づいて、ItemsSourceを通常Binding経由で設定するのではなく、ItemsControl.itemsControl.Items.Add()で明示的にアイテムをコントロールに追加しているかのように聞こえるか、Codebehind(itemscontrol.ItemsSource =私のコレクション)。 –

+0

XamlにItemsSourceを設定していません。私はPrism4でデフォルトのItemsControlRegionAdapterを使用しています。 ItemsSourceをvoid Adapt(IRegion region、ItemsControl regionTarget)にthis:regionTarget.ItemsSource = region.Viewsに設定します。ビューはIViewsCollection:IEnumerable 、INotifyCollectionChangedです。あまりにも狂ってここには何も起こっていない... – JJS

+0

あなたはコレクションに何があるか知っていますか?私は、SLがDataTemplateのDataContextとして使用する代わりに、レンダリングしようとしている要素であることをSLが知っているので、それが問題になるかもしれないと思います。 –

答えて

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; 
    } 

アダプタを呼んで、あなたは地域の工場を作成する必要があり、この項目を登録するには残りの部分はコントロール 'Wrapper'を実装して、そのクラスを作成してコンテンツを追加することができます。これは単に、この例でのスタイルに似た特定のスタイルのContentControlでもよいし、何か面白いものを追加することもできます。

このコードはPRISMの旧バージョンに基づいているため、最近変更された可能性があります。

希望これは

ミゲル

+0

答え@Miguel Maderoに感謝します。私はこれを試して、あなたに戻ってきます。 – JJS

関連する問題