2017-11-08 7 views
0

私の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を変更したいとき(下図参照)。 enter image description here

私はこのような(ボタンのイベントハンドラで)の背後にあるコードから私のTreeViewに新しいHierarchicalDataTemplateを割り当てようとしました:ということは、私はエラーを取得するよう

Private Sub ChangeTemplate() 

    CType(tv.ItemTemplate, HierarchicalDataTemplate).ItemTemplate = CType(Me.FindResource("Level2YellowTemplate"), HierarchicalDataTemplate) 

End Sub 

これは、可能ではありません"Template-Objectが使用(封印)されるとすぐに、変更することはできません。"

このテンプレートは変更できますか?私はTreeViewを持ってUserControl、内のプロパティを定義し

:@Bobからhelfupfulコメントへ

+0

'DataTemplateSelector'を見てください。実行時にテンプレートから別のテンプレートに切り替えることができます。 – Bob

+0

@Bobしかし、私は 'DataTemplateSelector'が自分のデータのいくつかのプロパティに基づいて' DataTemplate'を選択すると思います、そうですか? – Yvonnila

+0

はい。あなたは新しいテンプレートをどのように選ぶつもりですか? – Bob

答えて

1

おかげで、私はこのような問題を解決しました。

私はこのようなレベル1のHierarchicalDataTemplateを変更:

<HierarchicalDataTemplate x:Key="Level1Template" 
         ItemsSource="{Binding Value}" 
         ItemTemplateSelector="{StaticResource MySelector}"> 
    <Border Background="Green"> 
     <TextBlock Text="Level1"/> 
    </Border> 
</HierarchicalDataTemplate> 

IはMySelectorクラスを実装しPublic Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate機能を実装しました。 containerを使用して、UserControlとそのプロパティにアクセスできました。

私のTreeViewItemsSourceは、私のユーザコントロールのボタンを押すと変更されます。各変更の後、TemplateSelectorが呼び出され、テンプレートが更新されます。

関連する問題