WPF TreeView不拾取模板,而是调用ToString()
本文关键字:调用 ToString TreeView WPF | 更新日期: 2023-09-27 18:16:51
在我的XAML:
中有这样的内容<TreeView DataContext="{Binding Source={StaticResource Locator}}" ItemsSource="{Binding SomeTree.TopLevelItems}">
<TreeView.Resources>
<DataTemplate DataType="{x:Type vm:ILeaf}">
<CheckBox Content="{Binding Name}" IsThreeState="False" IsChecked="{Binding IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type vm:IGroup}" ItemsSource="{Binding Children}">
<CheckBox Content="{Binding Name}" IsThreeState="True" IsChecked="{Binding IsEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
vm:
定义如下:
xmlns:vm="clr-namespace:My.ViewModels.MyTree"
MyTree
命名空间包含IGroup
和ILeaf
接口。
SomeTree.TopLevelItems
是IGroup
s和ILeaf
s的可枚举对象(它是动态填充的)。
现在,我的TreeView应该相应地显示一个复选框树,但它只显示项目源的顶级元素,不应用数据模板,而是在元素上调用ToString()
。
另一个提到同样问题的帖子在这里不适用,我已经检查过了。
我错过/做错了什么?
模板只能处理具体类而不能处理接口,
这是一个功能,如果你有两个接口在一个类应该选择哪个模板?
因为系统不知道你不允许这样做
在这里查看完整的MS响应https://social.msdn.microsoft.com/Forums/vstudio/en-US/1e774a24-0deb-4acd-a719-32abd847041d/data-templates-and-interfaces?forum=wpf
使用DataTemplateSelector而不是Type查找,这样你可以告诉系统如何解释多接口情况
public class TaskListDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Task)
{
Task taskitem = item as Task;
if (taskitem.Priority == 1)
return
element.FindResource("importantTaskTemplate") as DataTemplate;
else
return
element.FindResource("myTaskTemplate") as DataTemplate;
}
return null;
}
}