Я пытаюсь указать KeyValuePair<int,MyClass>
как тип данных для DataTemplate в WPF. KeyValuePair - из объекта ObservableDictionary
(я использую реализацию Dr WPF, если это уместно.
Использование Как ссылаться на общий тип в атрибуте DataType для HierarchicalDataTemplate? , Я смог получить что-то близкое, однако, я получаю ошибку компилятора.
Мне нужно определить HierarchicalDataTemplate для KeyValuePair, чтобы я мог создать другой лист в TreeView под ним, содержащий коллекцию, которая является частью объекта 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.
Является ли то, что я пытаюсь сделать, даже возможно? Если да, то есть ли лучший подход?
По-моему, использование KeyValuePair
как DataContext TreeViewItem неверно. KeyValuePair запечатан, поэтому вы не можете реализовать интерфейс INotifyPropertyChanged
. Кроме того, вы не можете использовать расширение GenericKeyValuePairType
поскольку компилятор считает, что вы хотите использовать этот объект как DataType (читайте здесь для получения дополнительной информации).
Действительно, ваша модель - объект MyClass
(вы подтвердили, что к MyList
принадлежит свойство MyList
). В этом случае ваш DataTemplate будет:
<HierarchicalDataTemplate DataType="{x:Type local:MyClass}"
ItemsSource="{Binding Path=MyList}" />
Я считаю, что это концептуально более корректно.
HierarchicalDataTemplate
для KeyValuePairs в этом словаре, поскольку у объекта Value есть другая коллекция, которая станет еще одним листом вTreeView
. Поэтому я должен иметь возможность определить структуру под ним. Я попытался подключиться к свойствуValues
, которое работает, но поскольку коллекцияValues
не наблюдается, любые изменения в словаре не отображаются вTreeView