Wpf UserControl и MVVM - PullRequest
       31

Wpf UserControl и MVVM

22 голосов
/ 26 июля 2010

Я думаю о написании пользовательского элемента управления WPF для моего приложения. Я использую MVVM в моем приложении.

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

Dependency Properties необходимо создать в классе View, поскольку виртуальная машина не наследуется от DependencyObject. Это означает добавление кода в код XAML позади.

Мне было интересно, можете ли вы дать совет, как мне разработать пользовательский элемент управления при разработке приложения WPF с использованием MVVM ...

Ответы [ 3 ]

27 голосов
/ 26 июля 2010

Случай 1: Если вы создаете этот элемент управления только для использования в вашем приложении, тогда вы можете продолжить и создать для него ViewModel, но тогда вам не нужно создавать DP,ваш ViewModel может просто реализовать INotifyPropertyChanged, и ваш родительский Vm все еще может связываться с ними.

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

Случай 2: Если вашЭлемент управления будет использоваться другими приложениями / разработчиками, и вы не хотите упростить его, а затем приступайте к созданию пользовательских элементов управления после реализации шаблона элемента управления.Таким образом, вы можете создавать элементы управления без вида и использовать dependency properties.Более того, любому, кто использует этот элемент управления, не нужно знать о связанной модели представления и использовать его.

Некоторые из подобных вопросов / сообщений:

Вопрос о дизайне WPF (пользовательский элемент управления илиmvvm): Вопрос о дизайне WPF (пользовательский элемент управления или mvvm)

Пользовательский элемент управления в WPF с использованием концепции MVVM: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6293b176-e1e9-4610-af49-d53e6d294969/

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

9 голосов
/ 10 апреля 2014

A UserControl является частью «Представления» в «MVVM», так же как элементы управления TextBox или ListView являются частью представления.

Если вы решите использовать MVVM для разработки самого UserControl или написать его в QBASIC (не рекомендуется), это не нарушает шаблон MVVM для потребителей вашего UserControl, если они могут выполнять все, что им нужно с вашим UserControl путем привязки к DependencyProperty, выставленному на вашем UserControl. т. е. ваш UserControl должен предоставлять свойства, от которых зависит (отсюда и название). Как только вы поймете, что это DependencyProperty внезапно обретет большой смысл, и вы захотите, чтобы они были полезны при изменении обработчиков событий и значений по умолчанию, указанных вами в их конструкторе.

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

При этом многие говорили, что вы будете строить свой UserControl, используя сам шаблон MVVM, по всем уважительным причинам, которые приводит MVVM, например. помогая другому разработчику, глядя на ваш код. Однако некоторые вещи просто невозможны и / или намного сложнее, сложнее и менее производительно взломать XAML, чтобы сделать это - я не говорю о вашем садовом варианте Add User Form, но, например, о UserControl, обрабатывающем макет тысяч визуалов. Более того, поскольку вы работаете с вашим View, вы NOT хотите, чтобы ваши ViewModels UserControl были смешаны с вашими приложениями!

По сути, я говорю, что в MVVM хорошо не использовать MVVM в вашем View!

0 голосов
/ 20 февраля 2018

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

Этот шаблон хорошо сработал для меня на вашем UserControl XAML:

<UserControl x:Class="Six_Barca_Main_Interface.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Six_Barca_Main_Interface"
             xmlns:System="clr-namespace:System;assembly=mscorlib" 
             mc:Ignorable="d" 
             d:DesignHeight="900" d:DesignWidth="900">

    <DockPanel  x:Name="rootDock" >
        <TextBlock>{Binding SomethingInMyUserControlViewModel}</TabControl>
    </DockPanel>
</UserControl>

Тогда по коду позади:

public partial class MyUserControl : UserControl
{
    UserControlViewModel _vm;

    public MyUserControl()
    {
        InitializeComponent();

        //internal viewModel set to the first child of MyUserControl
         rootDock.DataContext = new UserControlViewModel();

        _vm = (UserControlViewModel)rootDock.DataContext;    

        //sets control to be able to use the viewmodel elements

     }

     #region Dependency properties 
     public string textSetFromApplication
     {
         get{return (string)GetValue(textSetFromApplicationProperty);}
         set{SetValue(textSetFromApplicationProperty, value);}
     }

     public static readonly DependencyProperty textSetFromApplicationProperty = DependencyProperty.Register("textSetFromApplication", typeof(string), typeof(MyUserControl), new PropertyMetadata(null, OnDependencyPropertyChanged));

     private static void  OnDependencyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
        ((MyUserControl)d)._vm.SomethingInMyUserControlViewModel = 
             e.NewValue as string;
     }
     #endregion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...