Я настроил ContentControl.DataTemplateSelector на мой желаемый.
Я хочу, чтобы в соответствии с командой или любым другим, вызовите ContentControl, чтобы повторно выбрать шаблон из селектора либо с помощью xaml, либо с помощью кода.
Спасибо
Я настроил ContentControl.DataTemplateSelector на мой желаемый.
Я хочу, чтобы в соответствии с командой или любым другим, вызовите ContentControl, чтобы повторно выбрать шаблон из селектора либо с помощью xaml, либо с помощью кода.
Спасибо
Я не знаю ни одного (не-kludgy) способа сделать это: вызывается DataTemplateSelector, когда WPF должен выбрать шаблон и что одноразовое решение в WPF. (Вы можете убить его, заставив WPF подумать, что контент изменился, например, установив контент в нуль, а затем обратно - я думаю, что это сработает, но не проверит его, но это довольно уродливо!) Если есть хороший способ сделать это мне тоже было бы интересно узнать!
Однако существует альтернативный способ изменения отображения контента, который обновляется в ответ на изменения данных, и это происходит через триггеры. Вы можете использовать DataTriggers в своей коллекции DataTemplate.Triggers
для отображения и скрытия элементов в зависимости от данных контента. Чтобы изменить весь экран, вы можете, например, настроить две визуализации в сетке и использовать триггеры для контроля того, какой из них видим. Вы даже можете сделать свой шаблон данных ContentControl и использовать триггер для изменения ContentTemplate. Конечно, это зависит от критериев изменения свойств связывания, которые могут быть не всегда.
Вот несколько кратких обсуждений селекторов против триггеров, хотя и в немного другом контексте.
Поздно к вечеринке, я знаю. =)
Когда вы столкнулись с этой проблемой, мне было проще всего установить новый шаблон TemplateSelector, например
MyContentControl.ContentTemplateSelector =
new MyDataTemplateSelector();
Я думаю, что я даже позже на вечеринку, но для другой идеи, которая может помочь кому-то...
Вы также можете попробовать использовать ValueConverter
в свойстве ContentControl
ContentTemplate
вместо DataTemplateSelector
.
Просто введите свойство в DataContext
для привязки, например ScreenNumber
. Затем в ValueConverter
верните DataTemplate
, который связан с ScreenNumber
.
Как и в случае с Jens, вместо создания нового экземпляра вы можете использовать существующий экземпляр DataTemplateSelector
.
var currentSelector = MyContentControl.ContentTemplateSelector;
MyContentControl.ContentTemplateSelector = null;
MyContentControl.ContentTemplateSelector = currentSelector;