Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Обобщённый класс в качестве источника данных


Автор: Compositum 12.11.2010, 12:55
Добрый день. Хочу создать шаблон, завязанный на определённый тип. Как это делать в том случае, если тип обобщённый?
У меня есть класс ObservableDictionary<T>, а так же класс ValueInfo. Хочу создать шаблон для ObservableDictionary<ValueInfo>. без указания конкретного ключа, а чтобы он автоматически применялся ко всем объектам типа ObservableDictionary<ValueInfo>.

Пытался сделать так:
Код

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:bush="clr-namespace:Bushman.Common;assembly=Common"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!--Шаблон для ObservableDictionary<ValueInfo>-->
    <DataTemplate DataType="{x:Type bush:ObservableDictionary<bush:ValueInfo>}">
        <StackPanel>
            <Label Content="{Binding Source=DataContext, Path=Key}"/>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>

Ошибка компиляции:
Цитата

The type reference cannot find a public type named 'ObservableDictionary<bush:ValueInfo>'. 

Затем пробовал делать так (перед ValueInfo убрал "bush:"):
Код

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:bush="clr-namespace:Bushman.Common;assembly=Common"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!--Шаблон для ObservableDictionary<ValueInfo>-->
    <DataTemplate DataType="{x:Type bush:ObservableDictionary<ValueInfo>}">
        <StackPanel>
            <Label Content="{Binding Source=DataContext, Path=Key}"/>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>

Ошибка компиляции:
Цитата

The type reference cannot find a public type named 'ObservableDictionary<ValueInfo>'.


Третий вариант был таким (хотя мне бы хотелось указать не "T", а конкретный тип, поскольку тогда можно было бы назначить разные шаблоны исходя из типа значений словаря, т.е. один шаблон для ObservableDictionary<ValueInfo>, другой для ObservableDictionary<FileInfo>, и т.д. и т.п.):
Код

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:bush="clr-namespace:Bushman.Common;assembly=Common"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!--Шаблон для ObservableDictionary<ValueInfo>-->
    <DataTemplate DataType="{x:Type bush:ObservableDictionary<T>}">
        <StackPanel>
            <Label Content="{Binding Source=DataContext, Path=Key}"/>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>

Ошибка компиляции:
Цитата

The type reference cannot find a public type named 'ObservableDictionary<T>'.


Меня терзают смутные сомнения, что в XAML-разметке нельзя задать источником объекты обобщённых классов...
Если в окне xaml-редактора я ставлю символ ":" после "bush" - то в раскрывающемся списке отсутствует нужный мне обобщённый класс, хотя на самом деле он есть в указанном пространстве.


user posted image

Я не очень доверяю XAML-редактору MS VS 2010, т.к. неоднократно сталкивался с тем, что верный синтаксис он подчёркивал как ошибку, но при компиляции всё работало как часы. Возможно и с отображением обобщённых классов в раскрывающемся списке - такая же фигня...

Автор: Compositum 12.11.2010, 23:34
http://msdn.microsoft.com/ru-ru/library/ms753322.aspx в разделе  XAML 2009 пишут, что запрашиваемый мною функционал не реализован (к сожалению).
Т.о. тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)