Переключение шаблонов данных во время выполнения – проблема с обновлением

StackOverflow https://stackoverflow.com/questions/320219

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top