Как использовать пользовательские элементы управления в WPF MVVM - PullRequest
9 голосов
/ 27 июля 2011

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

Я хотел бы знать, как правильно сделать это в MVVM?Должен ли каждый пользовательский элемент управления иметь свою собственную модель представления или они по-прежнему должны быть связаны с основными свойствами модели представления?

Пожалуйста, предложите хороший подход.Спасибо,

Ответы [ 2 ]

5 голосов
/ 27 июля 2011

Когда я использую UserControl, я передаю данные через DependencyProperties.Мой UserControls не имеет ViewModels.UserControls обрабатывает переданные данные только особым образом.

Но если у меня есть представление, содержащее несколько подвидов, я предпочитаю иметь для каждого подвида собственную модель.Эти модели я буду связывать через свойство ViewModel MainView.

Некоторые примеры:

UserControl1, Код позади:

public partial class UserControl1 : UserControl
{
    public MyClass MyProperty
    {
        get { return (MyClass)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty", typeof(MyClass), typeof(UserControl1), new UIPropertyMetadata(null));


    public UserControl1()
    {
        InitializeComponent();
    }
}

 public class MyClass
{
    public int MyProperty { get; set; }
}

И использование вview, XAML:

<Window x:Class="Sandbox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Sandbox="clr-namespace:Sandbox">
  <Grid>
    <Sandbox:UserControl1 MyProperty="{Binding MyOtherPropertyOfTypeMyClassInMyViewModel, Mode=TwoWay}" />
  </Grid>

Надеюсь, это поможет

1 голос
/ 27 июля 2011

Хороший вопрос - но я не думаю, что есть один прямой ответ.

Это во многом зависит от формы ваших данных. Если разные пользовательские элементы управления - это разные представления для одних и тех же данных, то нет причин, по которым они не могут использовать одну и ту же ViewModel ... это одна из движущих сил MVVM - вы можете назначить одну и ту же ViewModel разным представлениям, чтобы показывать одинаковые данные по разному.

Но опять же, если ваша ViewModel начинает действительно раздуваться, и нет большого перекрытия, то разбейте его на более мелкие ViewModel. Может быть, тогда ваша основная ViewModel просто становится менеджером ViewModel с коллекцией ViewModel для раздачи различным пользовательским элементам управления в зависимости от ситуации?

...