2015-01-18 3 views
1

Я пытаюсь указать KeyValuePair<int,MyClass> как тип данных для DataTemplate в WPF. KeyValuePair это от ObservableDictionary объекта (я использую Dr WPF's implementation, если это уместно.Определение DataTemplate для KeyValuePair

Использование How to reference a generic type in the DataType attribute of a 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 для словаря. по какой причине вы не можете использовать эту реализацию? Я мог бы неправильно истолковать то, что вы пытаетесь сделать. – Default

+0

@Default Я использую его, но мне нужно определить «HierarchicalDataTemplate» для KeyValuePairs внутри этого словаря, поскольку объект Value имеет другую коллекцию, которая будет другим листом в «TreeView». Поэтому мне нужно определить структуру ниже. Я попытался подключиться к свойству «Значения», но это не так, потому что коллекция «Ценности» не наблюдается, любые изменения в Словаре не отображаются в «TreeView» – psubsee2003

+0

. В вашем «Иерархическом шаблоне» вы связываете «MyList» 'to' ItemsSource'. Но «KeyValuePair» не обладает свойством «MyList». Может ли MyClass быть источником шаблона? –

ответ

0

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

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

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

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