Наличие в вашем пользовательском элементе управления свойства IMailAddress
в качестве свойства зависимости совершенно допустимо.Сам WPF делает подобные вещи;например, ItemsControl
ожидает, что вы привяжете к нему коллекцию, поэтому он предоставляет свойство зависимости ItemsSource
типа IEnumerable
.
Пользовательские элементы управления / пользовательские элементы управления являются хорошим способом представления представлений, и не позволяйте freakazoids MVVM сказать вам иначе :) Кроме того, нет никаких причин, по которым это не может прекрасно работать с MVVM - например:
<local:MailAddressEditor
MailAddress="{Binding Path=Customer.BillingAddress}"
/>
Тем не менее, вам может понравиться использование Custom Control вместо UserControl.Это позволит вам создать элемент управления «без внешнего вида», который фокусируется на логике редактирования адреса, и позволит пользователям вашего элемента управления создавать стили независимо для рендеринга элемента управления.Когда люди используют ваш элемент управления, они могут использовать:
<local:MailAddressEditor
MailAddress="{Binding Path=Customer.BillingAddress}"
Style="{StaticResource SimpleInlineAddressEditor}"
/>
<local:MailAddressEditor
MailAddress="{Binding Path=Customer.BillingAddress}"
Style="{StaticResource ComplicatedAddressEditorWithGoogleMapsSelector}"
/>
В этом случае у нас есть один элемент управления с двумя стилями (и, возможно, двумя ControlTemplates) для придания полям разного макета.
Пользовательские элементы управления являются большим преимуществом для разработчика WPF - не все должно быть сделано через MVVM.Просто старайтесь осознавать, какой код входит в ваш пользовательский элемент управления - если он становится слишком логичным, вы, возможно, захотите перенести часть этого в модель представления.