Структурный шаблон проектирования для MVVM View Model? - PullRequest
2 голосов
/ 20 марта 2011

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

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Да. Система привязки WPF будет использовать пользовательский дескриптор типа для взаимодействия со свойствами вашей ViewModel во время выполнения. Я использовал это раньше, чтобы ключи KeyValueCollection отображались как свойства в коллекции.

Это имеет два важных преимущества. Упрощает связывание:

DataContext.SomeCollectionProperty[SomeKey] можно упростить до DataContext.SomeCollectionProperty.SomeKey и, если вы создадите дескриптор пользовательского типа для контекста данных, DataContext.SomeKey, что примерно так же просто, как и получается.

И это исправляет то, что я считаю ошибкой - строки формата отображаются даже при нулевом свойстве. Используя CTD, вы можете пропустить нулевые (и DBNull) свойства, гарантируя, что строки формата не будут отображаться, если свойство не существует:

Представьте, что у вас есть double?, который вы должны отобразить как сумму в долларах. Если вы используете следующую привязку: {Binding Price, FormatString='Price: {0:c}'} и цена равна нулю, вы получите следующее в вашем пользовательском интерфейсе: Price: $. Это безобразно Однако, если Price является свойством на основе PropertyDescriptor в вашем пользовательском интерфейсе, когда цена равна нулю, вы можете не сообщать об этом свойстве через CTD. Это предотвращает отображение строки формата вообще.

Вот очень хорошая ссылка на MSDN о , украшающем ваши типы CTD .

1 голос
/ 21 марта 2011

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

...