Ад Пользовательского элемента управления WPF с MVVM и Свойствами Зависимости

Это - то, что я пытаюсь сделать:

  • Я пишу a UserControl то, что я хочу быть использованным другими разработчиками.
  • Я хочу, чтобы конечные пользователи смогли использовать мое управление с помощью Свойств Зависимости.

    <lib:ControlView ControlsText={Binding Path=UsersOwnViewModelText} />
    
  • Я использую шаблон MVVM.

  • Я связываю свой ViewModels с использованием их Представления <DataTemplates>

    <DataTemplate DataType="{x:Type local:ControlViewModel}">  
        <local:ControlView />  
    </DataTemplate>
    

Таким образом, у меня есть два вопроса:

  1. Действительно ли я прав в размышлении, что, если UserControl используется в XAML затем, UserControl должен установить ViewModel как DataContext когда управление Loaded событие стреляет вместо того, чтобы использовать <DataTemplate> метод?

  2. Как я позволяю пользователям привязке данных со свойствами зависимости своего управления все еще будучи данными, связанными с моим ViewModel?

15
задан voytek 14 January 2016 в 23:05
поделиться

2 ответа

Во-первых, я не думаю, что MVVM - хороший выбор, если вы разрабатываете UserControl, который будет использоваться другими. Невидимый контроль - это то, что вам действительно следует развивать. У Джереми Моррилла есть сообщение в блоге на эту тему.

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

Внутри ControlView.xaml помещается:

<UserControl.DataContext>
    <local:ControlViewModel />
</UserControl.DataContext>
10
ответ дан 1 December 2019 в 01:16
поделиться

Вы должны разделить два варианта использования:

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

Важно отметить, что последнее зависит от первого, а не наоборот.

Вариант использования 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>

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

25
ответ дан 1 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: