【问题标题】:How to use User Controls in WPF MVVM如何在 WPF MVVM 中使用用户控件
【发布时间】:2011-10-14 02:10:20
【问题描述】:

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

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

请提出一个好的方法。谢谢,

【问题讨论】:

    标签: .net wpf mvvm wpf-controls binding


    【解决方案1】:

    当我使用 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 我会尝试这种方法。我也可以将它绑定到用户定义的类型吗?
    • 是的,检查上面的改进示例
    【解决方案2】:

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

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

    但话又说回来,如果您的 ViewModel 开始膨胀并且没有太多重叠,那么将其分解为更小的 ViewModel。也许那时您的主 ViewModel 就更像是一个 ViewModel 管理器,其中包含一组 ViewModel 以适当地分发给各种用户控件?

    【讨论】:

    • 你的解决方案很有趣。我将尝试实施它。我尝试使用多个视图模型,但无法让它们相互通信。你认为每个用户控件的数据上下文都应该对应一个自定义类型,它是主视图模型的一个属性。根据 MVVM 是否正确?
    • 是的 - 听起来是一种合理的方法
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多