Привязка к 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, чтобы выбрать шаблон во время выполнения на основе определенных критериев.