如何在WPF MVVM中使用用户控件

时间:2011-07-27 09:10:53

标签: .net wpf mvvm wpf-controls binding

您好我正在构建一个wpf应用程序,其中一个屏幕将包含用于执行各种应用程序的不同用户控件。

我想知道在MVVM中执行此操作的正确过程?每个用户控件是应该拥有自己的视图模型,还是应该仍然绑定到主View模型属性?

请建议一个好的方法。谢谢,

2 个答案:

答案 0 :(得分:5)

当我使用UserControl时,我通过DependencyProperties传递数据。我的UserControls没有ViewModels。 UserControls只以非常特殊的方式处理传递的数据。

但是,如果我有包含一些子视图的视图,我优先为每个子视图创建一个自己的模型。这些模型我将通过MainView的ViewModel属性进行绑定。

一些例子:

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; }
}

视图中的用法,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 :(得分:1)

好问题 - 但我认为没有一个直截了当的答案。

这在很大程度上取决于数据的形状。如果不同的用户控件对同一数据有不同的视图,那么他们没有理由不能共享相同的ViewModel ...这是MVVM的驱动力之一 - 您可以将相同的ViewModel提供给不同的视图以显示相同的数据以不同的方式。

但话又说回来,如果你的ViewModel开始真的膨胀并且重叠不多,那么将其分解为更小的ViewModel。也许那么你的主ViewModel就变成了一个ViewModel管理器,它带有一组ViewModel,可以根据需要分发给各种用户控件?