为KeyValuePair定义DataTemplate

时间:2015-01-18 08:39:55

标签: c# wpf key-value hierarchicaldatatemplate

我试图在WPF中指定KeyValuePair<int,MyClass>作为DataTemplate的数据类型。 KeyValuePair来自ObservableDictionary对象(如果相关,我正在使用Dr WPF's implementation

使用How to reference a generic type in the DataType attribute of a HierarchicalDataTemplate?,我能够得到一些结果,但是,我收到编译错误。

我需要能够为KeyValuePair定义HierarchicalDataTemplate,这样我就可以在它下面的TreeView中创建另一个包含一个集合的叶子,该集合是Dictionary的Value对象的一部分。

XAML很简单:

<HierarchicalDataTemplate DataType="{local:GenericKeyValuePairType  
                                     KeyType=sys:Int32, 
                                     ValueType=local:MyClass}" 
                          ItemsSource="{Binding Path=Value.MyList}" />

GenericKeyValuePairType是MarkupExtension

public class GenericKeyValuePairType : MarkupExtension
{
    public Type KeyType { get; set; }
    public Type ValueType { get; set; }


    public GenericKeyValuePairType() { }
    public GenericKeyValuePairType(Type keyType, Type valueType)
    {
        KeyType = keyType;
        ValueType = valueType;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return typeof(KeyValuePair<,>).MakeGenericType(this.KeyType, this.ValueType);
    }
}

当我这样做时,Visual Studio表明这是无效的。具体错误是:

  

字典的键不能是“TreeViewBindingTest.GenericKeyValuePairType”类型。仅支持String,TypeExtension和StaticExtension。

我想做的甚至可能吗?如果是这样,有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

在我看来,使用KeyValuePair作为TreeViewItem的DataContext是不正确的。 KeyValuePair是密封的,因此您无法实现INotifyPropertyChanged接口。 此外,您无法使用GenericKeyValuePairType扩展名,因为编译器认为您希望将该对象用作DataType(有关详细信息,请阅读here)。

确实,您的模型是MyClass对象(您确认MyList属性属于它)。在这种情况下,您的DataTemplate将是:

<HierarchicalDataTemplate DataType="{x:Type local:MyClass}" 
                          ItemsSource="{Binding Path=MyList}" />

我相信它在概念上更正确。