Это - то, что я пытаюсь сделать:
UserControl
то, что я хочу быть использованным другими разработчиками.Я хочу, чтобы конечные пользователи смогли использовать мое управление с помощью Свойств Зависимости.
<lib:ControlView ControlsText={Binding Path=UsersOwnViewModelText} />
Я использую шаблон MVVM.
Я связываю свой ViewModels с использованием их Представления <DataTemplates>
<DataTemplate DataType="{x:Type local:ControlViewModel}">
<local:ControlView />
</DataTemplate>
Таким образом, у меня есть два вопроса:
Действительно ли я прав в размышлении, что, если UserControl используется в XAML затем, UserControl должен установить ViewModel как DataContext
когда управление Loaded
событие стреляет вместо того, чтобы использовать <DataTemplate>
метод?
Как я позволяю пользователям привязке данных со свойствами зависимости своего управления все еще будучи данными, связанными с моим ViewModel?
Во-первых, я не думаю, что MVVM - хороший выбор, если вы разрабатываете UserControl, который будет использоваться другими. Невидимый контроль - это то, что вам действительно следует развивать. У Джереми Моррилла есть сообщение в блоге на эту тему.
С учетом сказанного, вы можете установить текст данных с помощью XAML, если у вас есть общедоступный конструктор по умолчанию.
Внутри ControlView.xaml помещается:
<UserControl.DataContext>
<local:ControlViewModel />
</UserControl.DataContext>
Вы должны разделить два варианта использования:
Важно отметить, что последнее зависит от первого, а не наоборот.
Вариант использования 1 будет использовать свойства зависимостей, привязки шаблонов, все, что необходимо для создания обычного элемента управления WPF:
MyControl.cs:
public class MyControl : Control
{
// dependency properties and other logic
}
Generic.xaml:
<ControlTemplate Type="local:MyControl">
<!-- define the default look in here, using template bindings to bind to your d-props -->
</ControlTemplate>
Затем вы должны определить вариант использования 2 как:
MyViewModel.cs:
public class MyViewModel : ViewModel
{
// properties and business logic
}
MyView.xaml:
<UserControl ...>
<local:MyControl SomeProperty="{Binding SomePropertyOnViewModel}" .../>
</UserControl>
Лучшее из обоих миров с четким разделением. Другие разработчики зависят только от элемента управления, который может (и, вероятно, должен) находиться в совершенно другой сборке, чем ваша модель представления и представление.