Привязка к DataTemplate динамически

У меня есть ListBox и несколько DataTemplateс, в отдельных файлах.

<ListBox ItemTemplate="{StaticResource ItemTemplate1}"/>

в Styles.xaml файл:

<DataTemplate x:Key="ItemTemplate1">...</DataTemplate>

<DataTemplate x:Key="ItemTemplate2">...</DataTemplate>

Я хочу изменить ItemTemplate из ListBox в зависимости от типа объекта, который находится в его списке.

Есть ли способ получить доступ к отдельным DataTemplateв коде позади, так что я могу связать со свойством моего Page?

3 ответа

Решение

Способ сделать это без TemplateSelector это указать свойство DataType и не указывать x:Key.

<DataTemplate DataType="{x:Type Type1}">...</DataTemplate>
<DataTemplate DataType="{x:Type Type2}">...</DataTemplate>

В этом случае соответствующий DataTemplate будет автоматически применяться во всех местах, где свойство указанного типа было связано.

Но я бы предпочел использовать TemplateSelector,

Чтобы получить доступ к отдельному DataTemplate в коде позади, вы должны сначала получить словарь ресурсов:

var dict = new ResourceDictionary 
{Source = new Uri("/ProjectNamespace;component/Styles.xaml",  UriKind.Relative)};

Тогда вы можете получить шаблон:

var dataTemplate = (DataTemplate) dict["ItemTemplate1"];

Попробуйте это решение в значительной степени, что вы пытаетесь достичь:

Динамическое применение шаблонов данных по типу в WP7

http://www.codeproject.com/Articles/113152/Applying-Data-Templates-Dynamically-by-Type-in-WP7

Он основан на WP7, но должен работать и для вас.

Существует встроенная поддержка в WPF по вашему требованию. Начните чтение с DataTemplateSelector, чтобы выбрать шаблон во время выполнения на основе определенных критериев.

Другие вопросы по тегам