Существуют ли какие-либо рекомендуемые шаблоны структурного проектирования для моделей представлений MVVM, которые позволяют динамически добавлять различные состояния и функциональные возможности к базовому объекту, но при этом сохраняют INotifyPropertyChanged для всех связанных свойств? Что-то вроде шаблона декоратора, но готового к mvvm?
Шаблон структурного проектирования для модели просмотра MVVM?
Ответы (2)
да. Система привязки WPF будет использовать дескриптор пользовательского типа для взаимодействовать со свойствами вашей ViewModel во время выполнения. Я использовал это раньше, чтобы ключи в KeyValueCollection‹T> отображались как свойства в коллекции.
Это имеет два важных преимущества. Это упрощает привязку:
DataContext.SomeCollectionProperty[SomeKey]
можно упростить до DataContext.SomeCollectionProperty.SomeKey
и, если вы создадите собственный дескриптор типа для контекста данных, DataContext.SomeKey
будет максимально простым.
И это исправляет то, что я считаю ошибкой — строки формата отображаются, даже если свойство имеет значение null. Используя CTD, вы можете пропустить нулевые (и DBNull) свойства, гарантируя, что строки формата не будут отображаться, если свойство не существует:
Представьте, что у вас есть double?
, которое вы должны отобразить в виде суммы в долларах. Если вы используете следующую привязку: {Binding Price, FormatString='Price: {0:c}'}
и цена равна нулю, вы получите следующее в своем пользовательском интерфейсе: Price: $
. Это некрасиво. Однако, если Price
является свойством на основе PropertyDescriptor в вашем пользовательском интерфейсе, когда цена равна нулю, вы можете не сообщать об этом свойстве через CTD. Это предотвращает отображение строки формата вообще.
Вот довольно хорошая ссылка в MSDN о украшении ваших типов с помощью CTD.
Из моих экспериментов вы можете использовать ExpandoObject в .NET 4 для обработки того, что вы хотите. ExpandoObject реализует INPC. Я создавал DynamicViewModel на основе ExpandoObject, который делает несколько других вещей, таких как вычисляемые свойства, которые имеют зависимости друг от друга, и регистрация команды делегирования.