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

.net 如何在WPF MVVM中使用用户控件,.net,wpf,mvvm,wpf-controls,binding,.net,Wpf,Mvvm,Wpf Controls,Binding,您好,我正在构建一个wpf应用程序,其中一个屏幕将包含用于执行各种应用程序的不同用户控件 我想知道在MVVM中这样做的正确过程是什么?每个用户控件应该有自己的视图模型,还是仍然绑定到主视图模型属性 请建议一个好的方法。谢谢,问得好-但我认为没有一个直截了当的答案 这在很大程度上取决于数据的形状。如果不同的用户控件在相同的数据上有不同的视图,那么它们没有理由不能共享相同的ViewModel…这是MVVM的驱动力之一-您可以将相同的ViewModel赋予不同的视图,以不同的方式显示相同的数据 但是,

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

我想知道在MVVM中这样做的正确过程是什么?每个用户控件应该有自己的视图模型,还是仍然绑定到主视图模型属性


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

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

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


但是,如果您的ViewModel开始膨胀,并且没有太多重叠,请将其分解为更小的ViewModel。也许您的主ViewModel更像是一个ViewModel管理器,它有一组ViewModel,可以根据需要分发给各种用户控件?

当我使用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>


希望这有帮助

嗨,我从未使用过DependencyProperties。你能给我一个链接或者简单解释一下用户控件应该如何使用依赖属性吗。我应该为一个userControl创建一个类型,然后将其绑定到视图中的各种属性吗?谢谢WaltiD,我将尝试这种方法。我还可以将其绑定到用户定义的类型吗?是的,请检查上面的改进示例您的示例是一个有趣的解决方案。我将努力实施它。我尝试使用多个视图模型,但无法让它们相互通信。您认为每个用户控件的datacontext是否应该对应于作为主viewmodel属性的自定义类型。根据MVVM,这是正确的吗?是的-听起来是一个合理的方法