ItemsControlのWPF Datatemplate
-
03-07-2019 - |
質問
ItemsControlがあり、そのItemsSourceはObservableCollection <
Component <!> gt;にバインドされます。実行時に。正常に機能するコンポーネントタイプのデータテンプレートを定義しました。
NowコンポーネントにはObservableCollection <=> Control <!> gt;があります。そして、コンポーネントデータテンプレート内に別のItemsControlを追加して、すべてのコントロールをレンダリングします。ここでのコントロールは、wpfコントロールに関連しない独自のカスタムオブジェクトです。
コントロールにはさまざまなタイプがあるため、ItemTemplateSelectorを使用して各タイプに適したテンプレートを選択しようとしています。以下の例では、サイズを小さくするために、テンプレート<!> quot; RWString <!> quotの1つのみを示しています。 SelectControlをオーバーライドするMyControlTemplateSelectorのFindResourceを使用して検索します。ただし、SelectTemplateは呼び出されません(チェックするブレークポイントを使用)。 xamlに何か問題がありますか?
<ItemsControl.Resources>
<src:MyControlTemplateSelector x:Key="XSelector" />
<DataTemplate DataType="{x:Type src:Component}" >
<Expander Visibility="{Binding Path=Show}">
<ItemsControl ItemsSource="{Binding Path=Contrls}"
ItemTemplateSelector="{StaticResource XSelector}">
<ItemsControl.Resources>
<DataTemplate x:Key="RWstring" >
<TextBlock Text="{Binding Path=Label}"/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate><WrapPanel /></ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Expander>
</DataTemplate>
</ItemsControl.Resources>
更新: Contrlsはタイプミスではなく、馬鹿げたネーミングシステムを使用している私だけです。 Contrlsは、ObservableCollection型のコンポーネントのプロパティです。また、ItemsTemplateSelectorを使用しようとしている理由は、ObservableCollection <=> Control <!> gt; Control <=> int <!> gt;のような汎用タイプのオブジェクトが含まれます。 Control <=> string <!> gt;などはすべてControlから派生しており、どうやらジェネリック型を参照するデータテンプレートを作成できないようです。
Update3:更新2は無関係であるため削除しました。 StaticResourceをDynamicResourceに変更することで、ItemTemplateSelectorが機能するようになりました。しかし、なぜこれが機能するのかわかりません...
解決
静的リソースが評価されるロード時に作成されていない可能性があるリソースがItemsControl内にあるため、これはStaticResourceでは機能しないと推測しています。
ロード時にDynamicResourcesはロード時に式に評価され、要求されたときに正しい値に評価されます。
ItemsControlの外にリソースを移動してみてください。
他のヒント
ネストされたItemsControlをバインドする行で、パスは正しいですか?現在は<!> quot; Contrls <!> quot;です。<!> quot; Controls <!> quot;?