私のWPFアプリケーションには3レベルのTreeView
があります。実行時にツリービューのDataTemplateを変更する
レベル1とレベル2にはそれぞれHierarchicalDataTemplate
があります。レベル3には独自のDataTemplate
があります。ここで
は、XAMLコードです:
<Window.Resources>
<HierarchicalDataTemplate x:Key="Level1Template"
ItemsSource="{Binding Value}"
ItemTemplate="{StaticResource Level2RedTemplate}">
<Border Background="Green">
<TextBlock Text="Level1"/>
</Border>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="Level2RedTemplate"
ItemsSource="{Binding Value}"
ItemTemplate="{StaticResource Level3Template}">
<Border Background="Red">
<TextBlock Text="Level2"/>
</Border>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="Level2YellowTemplate"
ItemsSource="{Binding Value}"
ItemTemplate="{StaticResource Level3Template}">
<Border Background="Yellow">
<TextBlock Text="Level2"/>
</HierarchicalDataTemplate>
<DataTemplate x:Key="Level3Template">
<Border Background="LightBlue">
<TextBlock Text="Level3"/>
</Border>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button Grid.Row="0"
Content="Change Template"
Click="ChangeTemplate" />
<TreeView Grid.Row="1"
Name="tv"
ItemsSource="{Binding Items}"
ItemTemplate="{StaticResource Level1Template}"/>
</Grid>
それはここまで完璧に動作します。 問題はから始まり、私のウィンドウのボタンを押してLevel2の項目のDataTemplate
を変更したいとき(下図参照)。
私はこのような(ボタンのイベントハンドラで)の背後にあるコードから私のTreeView
に新しいHierarchicalDataTemplate
を割り当てようとしました:ということは、私はエラーを取得するよう
Private Sub ChangeTemplate()
CType(tv.ItemTemplate, HierarchicalDataTemplate).ItemTemplate = CType(Me.FindResource("Level2YellowTemplate"), HierarchicalDataTemplate)
End Sub
これは、可能ではありません"Template-Objectが使用(封印)されるとすぐに、変更することはできません。"
このテンプレートは変更できますか?私はTreeView
を持ってUserControl
、内のプロパティを定義し
:@Bobからhelfupfulコメントへ
'DataTemplateSelector'を見てください。実行時にテンプレートから別のテンプレートに切り替えることができます。 – Bob
@Bobしかし、私は 'DataTemplateSelector'が自分のデータのいくつかのプロパティに基づいて' DataTemplate'を選択すると思います、そうですか? – Yvonnila
はい。あなたは新しいテンプレートをどのように選ぶつもりですか? – Bob