Определение DataTemplate для KeyValuePair

1

Я пытаюсь указать 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.

Является ли то, что я пытаюсь сделать, даже возможно? Если да, то есть ли лучший подход?

  • 0
    в теме, на которую вы ссылаетесь, есть пример xaml для словаря. любая причина, почему вы не можете использовать эту реализацию? Возможно, я неправильно понимаю, что вы пытаетесь сделать.
  • 0
    @Default Я использую его, но мне нужно определить HierarchicalDataTemplate для KeyValuePairs в этом словаре, поскольку у объекта Value есть другая коллекция, которая станет еще одним листом в TreeView . Поэтому я должен иметь возможность определить структуру под ним. Я попытался подключиться к свойству Values , которое работает, но поскольку коллекция Values не наблюдается, любые изменения в словаре не отображаются в TreeView
Показать ещё 2 комментария
Теги:
wpf
hierarchicaldatatemplate
key-value

1 ответ

0

По-моему, использование KeyValuePair как DataContext TreeViewItem неверно. KeyValuePair запечатан, поэтому вы не можете реализовать интерфейс INotifyPropertyChanged. Кроме того, вы не можете использовать расширение GenericKeyValuePairType поскольку компилятор считает, что вы хотите использовать этот объект как DataType (читайте здесь для получения дополнительной информации).

Действительно, ваша модель - объект MyClass (вы подтвердили, что к MyList принадлежит свойство MyList). В этом случае ваш DataTemplate будет:

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

Я считаю, что это концептуально более корректно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню