您好,我正在尝试动态更改数据模板,但我在 TreeViewItemTemplateSelector 类中的方法 SelectTemplate 从未被调用(我已通过调试器检查过):( 请帮助我 :)
来自 xaml MainWindow 的代码:
后面代码中的代码:
您好,我正在尝试动态更改数据模板,但我在 TreeViewItemTemplateSelector 类中的方法 SelectTemplate 从未被调用(我已通过调试器检查过):( 请帮助我 :)
来自 xaml MainWindow 的代码:
后面代码中的代码:
将 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 内部。
您的问题似乎是您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
用于呈现数据。