Переключение шаблонов данных во время выполнения – проблема с обновлением
-
11-07-2019 - |
Вопрос
Я использую архитектуру MVVM для разделения моего приложения.То есть вы часто видите что-то вроде
var u = new UserControl();
u.Content = new MyCustomType(); // MyCustomType is not a control
Пользовательский интерфейс определяется с помощью шаблонов данных, которые хранятся в словарях ресурсов в их собственных файлах XAML
<ResourceDictionary ...>
<DataTemplate DataType="{x:Type local:MyCustomType}">
...
Я загружаю ресурсы при запуске приложения, и приложение с радостью отображает мой пользовательский интерфейс.Но если я удалю шаблон данных и добавлю новый (тот же ключ, тот же тип данных), пользовательский интерфейс по-прежнему использует старый шаблон данных.Конечно, я могу переустановить содержимое моего контейнера для принудительного обновления, но это кажется глупым, потому что я должен уведомлять каждый элемент управления об изменении, вот так
var tmp = control.Content;
control.Content = null;
control.Content = tmp; // New data template will be used
Есть какие-нибудь другие подходы?
Решение
Это связано с тем, что ресурсы в вашем словаре статичны.После того, как они были использованы, они не будут обновляться.Вы могли бы попробовать перезагрузить словари, но это обновит только новые элементы управления, а не старые..
Если вы хотите поддерживать несколько DataTemplates, вы можете рассмотреть класс DataTemplateSelector, который выберет шаблон в соответствии с вашими условиями:http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx
Если вам нужно переключать шаблоны "на лету", вы всегда можете рассмотреть возможность использования ControlTemplates и привязки к свойству Template вашего элемента управления...
{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}
HTH