Шаблон структурного проектирования для модели просмотра MVVM?

Существуют ли какие-либо рекомендуемые шаблоны структурного проектирования для моделей представлений MVVM, которые позволяют динамически добавлять различные состояния и функциональные возможности к базовому объекту, но при этом сохраняют INotifyPropertyChanged для всех связанных свойств? Что-то вроде шаблона декоратора, но готового к mvvm?


person Dean    schedule 20.03.2011    source источник


Ответы (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.

person Community    schedule 20.03.2011
comment
Я использовал эту технику до того, как она стала хорошей альтернативой, если у вас нет доступной динамики. - person Michael Brown; 21.03.2011

Из моих экспериментов вы можете использовать ExpandoObject в .NET 4 для обработки того, что вы хотите. ExpandoObject реализует INPC. Я создавал DynamicViewModel на основе ExpandoObject, который делает несколько других вещей, таких как вычисляемые свойства, которые имеют зависимости друг от друга, и регистрация команды делегирования.

person Michael Brown    schedule 21.03.2011
comment
Я пытался сделать это раньше, но в то время я не хотел иметь дело с пайплайном. Есть ли у вас хорошие ресурсы для реализации расширения? - person ; 21.03.2011
comment
Стандартный ExpandoObject работает как есть. Я получаю от DynamicObject напрямую, чтобы добавить дополнительную функциональность. Я скоро поделюсь сообщением в блоге о технике и обновлю этот пост, когда я это сделаю. - person Michael Brown; 21.03.2011
comment
Ну, я благодарю вас обоих за ответы. Хотя немного огорчает, что нет шаблона проектирования, например, из GOF, который вы используете - это обращение к атрибутам и обману? - person Dean; 23.03.2011
comment
Вы понимаете, что книга о GoF была написана 16 лет назад? Шаблоны программирования никогда не должны были быть статичными, языки меняются, индустрия меняется. Открываются и развиваются новые шаблоны, которые используют преимущества того, что доступно. Вы могли бы назвать это обманом, но это просто использование возможностей языка и фреймворка. - person Michael Brown; 26.03.2011