Рекомендации WPF: работают ли пользовательские элементы управления с дизайном MVVM?

Я смотрел на создание общего элемента управления, который я смогу повторно использовать на своих страницах: AddressControl, который имеет Address1, Address2, City, State, Zip и т.д.

Изначально я только что создал класс (AddressEntity), содержащий все эти элементы и реализованный INotifyPropertyChanged. Я включил этот класс в DependencyProperty в свой Code-Behind для AddressControl и использовал его как DataContext для привязки к его свойствам.

Затем, кто-то сказал, что мой код был уродлив, и я должен посмотреть в MVVM. Глядя на это, я предполагаю, что:

  • AddressEntity.cs будет просто контейнером данных (т.е. Address1, Address2 и т.д.) и членами (например, Clone, ToString и т.д.).
  • Мне нужен некоторый AddressViewModel для переноса моего AddressEntity и предоставления изменений PropertyNotification, Validation и т.д.
  • Мне нужно каким-то образом "посмотреть" для этого.

Проблема заключается в том, что каждый пример, который я когда-либо видел, имеет UserControl как View, а не CustomControl. Прежде чем я углубится в это...

  • Можно ли использовать MVVM + Custom Controls для этого примера?
  • Это почти то же самое (UserControl vs CustomControl) как представление, за исключением первичных различий UserControl и CustomControl? В принципе, мой CustomControl действительно просто View?

Ссылки: Шаблон проектирования Model-View-ViewModel (MVVM) для WPF

Ответы

Ответ 1

CustomControls никогда не выполняются с помощью mvvm.

То, что вы хотите, представляет собой многоразовый вид (пользовательский контроль) ваших данных, а не элемент управления (настраиваемый элемент управления).

UserControls и CustomControls являются двумя совершенно разными животными.

EDIT:

Независимо от того, почему UserControls были изначально разработаны, в MVVM обычно используется UserControl, когда вы хотите использовать повторно используемое представление, которое является специфичным для вашей модели /viewmodel. Его просто XAMl без какого-либо кода (за исключением автоматически созданного материала InitializeComponent). Как правило, вы сохраняете UserControl в том же проекте, в котором вы его используете.

Вы переходите на CustomControl, когда хотите использовать общую функциональность, которая требует просмотра и которая потенциально может использоваться даже вне сферы вашего текущего приложения. Здесь элемент управления фактически определен в файле кода, и внешний вид (который может быть переопределен) приходит через XAML в словаре ресурсов. Как правило, вы сохраняете CustomControl в отдельном проекте ControlLibrary и ссылаетесь на библиотеку в проекте, в котором вы хотите его использовать.

С уважением к WallStreetProgrammer, выбор между пользовательским элементом управления и настраиваемым элементом управления, основанный исключительно на том, хотите ли вы, чтобы бесполезный элемент управления был немного наивным.

Ответ 2

При использовании MVVM Model и ViewModel не должны зависеть от вида, т.е. им не важно, какой вид их использует.

Разница между настраиваемым элементом управления и пользовательским элементом управления в WPF заключается в том, что пользовательский элемент управления является беззаботным и может быть настроен с помощью ControlTemplate. Это то, что вы должны написать, если пишете общую библиотеку управления, как это делает Microsoft. Если вы, тем не менее, имеете конкретный вид, потому что вы контролируете его, просто зайдите с помощью пользовательского элемента управления, он намного быстрее, но будет иметь только один вид, который вы определяете для него.

В проекте MVVM обычно используется сочетание пользовательских элементов управления и пользовательских элементов. Например, вы, вероятно, будете использовать кучу пользовательских элементов управления от Microsoft (например, текстовые поля и текстовые блоки) и объединить их в пользовательские элементы управления.

См. Обзор управления авторами