如何让DataTemplate识别GenericType

时间:2013-07-08 21:13:23

标签: c# wpf datatemplate hierarchicaldatatemplate

我在TreeView控件中显示节点,我遇到了使用泛型正确显示数据的问题。更具体地说,WPF似乎无法定位数据模板。我猜这是因为x:Type被声明为NodeViewModel`1,实际类型是NodeViewModel< INode>。但是,如果我尝试使用NodeViewModel< INode>,则XAML将无法编译。

我有一个HierachialDataTemplate,如下所示:

<HierarchicalDataTemplate 
        ItemsSource="{Binding Path=Children}" 
        DataType="{x:Type viewModels:NodeViewModel`1}">
    <TextBlock Text="{Binding Path=Node.NodeDescription}" />                
</HierarchicalDataTemplate>

NodeViewModel声明为:

public class NodeViewModel<T> where T : INode
{
    public T Node { get {...} set {...} }
}

节点接口看起来像这样:

public interface INode
{
    string NodeDescription { get; }
}

1 个答案:

答案 0 :(得分:1)

我认为不支持您正在尝试做的事情。您可以编写自定义MarkupExtension来返回已关闭的泛型类型,但看起来您希望对任何DataTemplate使用相同的NodeViewModel<T> where T : INode。在这种情况下,WPF需要支持开放泛型作为键。它没有。

如果是这种情况,那么只需给HierarchicalDataTemplate一个密钥并将其直接应用到TreeView,你就会好得多。

或创建DataTemplateSelector并检查数据项的类型以选择正确的模板。