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命名空间包含IGroupILeaf接口。

SomeTree.TopLevelItemsIGroup s和ILeaf s的可枚举对象(它是动态填充的)。

现在,我的TreeView应该相应地显示一个复选框树,但它只显示项目源的顶级元素,不应用数据模板,而是在元素上调用ToString()

另一个提到同样问题的帖子在这里不适用,我已经检查过了。

我错过/做错了什么?

WPF 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;
    }
}