Явно обновить DataTemplate из DataTemplateSelector?

Я настроил ContentControl.DataTemplateSelector на мой желаемый.
Я хочу, чтобы в соответствии с командой или любым другим, вызовите ContentControl, чтобы повторно выбрать шаблон из селектора либо с помощью xaml, либо с помощью кода.

Спасибо

Ответы

Ответ 1

Я не знаю ни одного (не-kludgy) способа сделать это: вызывается DataTemplateSelector, когда WPF должен выбрать шаблон и что одноразовое решение в WPF. (Вы можете убить его, заставив WPF подумать, что контент изменился, например, установив контент в нуль, а затем обратно - я думаю, что это сработает, но не проверит его, но это довольно уродливо!) Если есть хороший способ сделать это мне тоже было бы интересно узнать!

Однако существует альтернативный способ изменения отображения контента, который обновляется в ответ на изменения данных, и это происходит через триггеры. Вы можете использовать DataTriggers в своей коллекции DataTemplate.Triggers для отображения и скрытия элементов в зависимости от данных контента. Чтобы изменить весь экран, вы можете, например, настроить две визуализации в сетке и использовать триггеры для контроля того, какой из них видим. Вы даже можете сделать свой шаблон данных ContentControl и использовать триггер для изменения ContentTemplate. Конечно, это зависит от критериев изменения свойств связывания, которые могут быть не всегда.

Вот несколько кратких обсуждений селекторов против триггеров, хотя и в немного другом контексте.

Ответ 2

Поздно к вечеринке, я знаю. =)

Когда вы столкнулись с этой проблемой, мне было проще всего установить новый шаблон TemplateSelector, например

MyContentControl.ContentTemplateSelector =
     new MyDataTemplateSelector();

Ответ 3

Я думаю, что я даже позже на вечеринку, но для другой идеи, которая может помочь кому-то...

Вы также можете попробовать использовать ValueConverter в свойстве ContentControl ContentTemplate вместо DataTemplateSelector.

Просто введите свойство в DataContext для привязки, например ScreenNumber. Затем в ValueConverter верните DataTemplate, который связан с ScreenNumber.

Ответ 4

Как и в случае с Jens, вместо создания нового экземпляра вы можете использовать существующий экземпляр DataTemplateSelector.

var currentSelector = MyContentControl.ContentTemplateSelector;     
MyContentControl.ContentTemplateSelector = null;
MyContentControl.ContentTemplateSelector = currentSelector;