こんにちは、データテンプレートを動的に変更しようとしていますが、クラス TreeViewItemTemplateSelector のメソッド SelectTemplate が呼び出されません (デバッガーで確認しました) :( 助けてください :)
xaml MainWindow からのコード:
分離コード内のコード:
こんにちは、データテンプレートを動的に変更しようとしていますが、クラス TreeViewItemTemplateSelector のメソッド SelectTemplate が呼び出されません (デバッガーで確認しました) :( 助けてください :)
xaml MainWindow からのコード:
分離コード内のコード:
あなたの問題は、あなたTreeViewCustomItem
がから継承しているようTreeViewItem
です。( http://pastebin.com/jnP2nWMFに見られるように)
その継承 (および依存関係プロパティ) を削除すると、テンプレート セレクターが正常に起動します。ノード項目で何を達成しようとしていましたか?
OutputWindow を見ると、次のメッセージが表示されます。
System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='TreeViewCustomItem'
TreeViewItem
アイテムを にバインドするためにTreeView
アイテムを から継承する必要はありません。 はがデータを保持するために使用し、 はデータをTreeViewItem
表示するために使用されます。TreeView
DataTemplate
DataTemplates を TreeView.Resources から Window.Resources に移動
<Window.Resources><DataTemplate x:Key="DefaultTemplate">
<TextBlock Text="{Binding Header}"></TextBlock>
</DataTemplate><DataTemplate x:Key="Regulation">
<TextBlock Text="{Binding Path=Header}" FontWeight="Bold"></TextBlock>
</DataTemplate>
<DataTemplate x:Key="Article">
<TextBlock Text="{Binding Path=Header}" Foreground="Green"></TextBlock>
</DataTemplate>
<local:TreeViewItemTemplateSelector x:Key="TemplateSelector" DefaultTemplate="{StaticResource DefaultTemplate}" ArticleTemplate="{StaticResource Article}" RegulationTemplate="{StaticResource Regulation}" />
そして変更を加える
<TreeView ItemTemplateSelector="{StaticResource TemplateSelector}" Height="409" HorizontalAlignment="Left" Margin="10,10,0,0" Name="treeView1" VerticalAlignment="Top" Width="277" ItemsSource="{Binding}"/>
コードを更新すると表示されます。私は同様のコードを VS に入れましたが、動作するので、詳しく調べる必要があります。だから私はこれをチェックして変更しました
public class TreeViewCustomItem
{
public string Header { get; set; }
}
この
listmy = new ObservableCollection<TreeViewCustomItem> { new TreeViewCustomItem { Header = "xD" }, new TreeViewCustomItem { Header = "xxD" } };
//treeView1.ItemsSource = listmy;
this.DataContext = listmy;
public class selector : DataTemplateSelector
{
public DataTemplate RegulationTemplate { get; set; }
public DataTemplate DefaultTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
TreeViewCustomItem treeViewItem = item as TreeViewCustomItem;
if (treeViewItem.Header == "xD")
{
return RegulationTemplate;
}
else
{
return DefaultTemplate;
}
}
}
XAMLでは次のようになります
xmlns:local="clr-namespace:WpfApplication1.Views">
<Window.Resources>
<DataTemplate x:Key="DefaultTemplate">
<TextBlock Text="{Binding Header}"></TextBlock>
</DataTemplate>
<DataTemplate x:Key="Regulation">
<TextBlock Text="{Binding Path=Header}" FontWeight="Bold"></TextBlock>
</DataTemplate>
<local:selector x:Key="selector_" DefaultTemplate="{StaticResource DefaultTemplate}" RegulationTemplate="{StaticResource Regulation}"/>
</Window.Resources>
<Grid>
<TreeView Height="409" HorizontalAlignment="Left" Margin="10,10,0,0" Name="treeView1" VerticalAlignment="Top" Width="277"
ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource selector_}"/>
</Grid>
そしてそれはうまくいくので、問題はTreeViewCustomItem内にあると私は推測しています。