我试图在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。
我想做的甚至可能吗?如果是这样,有更好的方法吗?
答案 0 :(得分:1)
在我看来,使用KeyValuePair
作为TreeViewItem的DataContext是不正确的。 KeyValuePair是密封的,因此您无法实现INotifyPropertyChanged
接口。
此外,您无法使用GenericKeyValuePairType
扩展名,因为编译器认为您希望将该对象用作DataType(有关详细信息,请阅读here)。
确实,您的模型是MyClass
对象(您确认MyList
属性属于它)。在这种情况下,您的DataTemplate将是:
<HierarchicalDataTemplate DataType="{x:Type local:MyClass}"
ItemsSource="{Binding Path=MyList}" />
我相信它在概念上更正确。