【问题标题】:Passing data to user control in MVVM pattern以 MVVM 模式将数据传递给用户控件
【发布时间】:2012-04-06 16:09:08
【问题描述】:

背景:

我有一个包含用户控件的主窗口的 WPF 应用程序。我想将一个值从主窗口传递给用户控件。

在主窗口的构造函数中我有代码:

    public MainWindow()
    {
        InitializeComponent();
        _vm = new MainWindowViewModel();
        this.DataContext = _vm;
        ucControl = new UserControl1("NameSet");
    }

(ucControl 是我的用户控件)

用户控件有两个构造函数:

    public UserControl1()
    {
        InitializeComponent();
        this.ID = ID.GetNewID;
    }

    public UserControl1(string name)
    {
        InitializeComponent();
        _vm = new UCViewModel(name);
        this.DataContext = _vm;
        this.ID = ID.GetNewID;
    }

问题是:虽然调用了第二个构造函数(带参数),但它并没有加载到主窗口中。我检查了用户控件的加载事件中的 ID (this.ID),我看到在默认构造函数中设置的 ID 并且它的 DataContext 为空。由于这个原因,我没有在我的用户控件中获得“名称”字符串。

有什么帮助吗?由于我使用的是 MVVM 模式,因此我不想公开用户控件(视图)中的属性,以便为此从主窗口设置。

【问题讨论】:

  • 你从那里加载了这个用户控件.. 显示更多代码
  • 用户控件在主窗口的 xaml 中。
  • 我猜这个问题类似于stackoverflow.com/questions/4802278/…。这会有所帮助。
  • 是的,您应该尝试在用户控件中创建依赖属性并使用它而不是 ctor 中的参数
  • 但是属性“name”在 ViewModel 中,是不是在 View(用户控件)中声明了一些针对 MVVM 模式的业务属性?

标签: wpf mvvm user-controls


【解决方案1】:

您正在实例化 UserControl1 对象两次:

  1. 在 XAML 中一次。 元素使用默认构造函数实例化一个 UserControl1 对象,并将其分配给成员 ucControl。

  2. 在 MainWindow 对象的构造函数中再次实例化它

如果你在 UserControl 的构造函数中放置一个断点,你会注意到它被调用了两次。我假设 WPF 在分配动态 UserControl(上面的#2)之后实例化并初始化 XAML 的 UserControl(上面的#1),这就是为什么你在 MainWindow 的逻辑树中看到前者的原因。

您应该只有一个实例。如果您想参数化用户控件,规范范式就是您提到您不想做的事情(为什么??)。如果您有这样的属性,您可以在 XAML 中设置它:

【讨论】:

  • 感谢您的回复。我在用户控件的视图模型中有“名称”属性。我该如何设置?当然这行不通 -
  • 我们是否应该在用户控件类中复制视图模型中的所有属性,只是为了这个目的?
  • DataContext.Name 会失败,只需在代码中访问 ucControl.DataContext。
  • @thewpfguy - UserControl 的 DataContext 与 UserControl 不同。您还需要通过代码(典型)或通过 XAML 实例化它。如果通过代码,您将通过 MainWindow 视图模型执行此操作,通常它是 MainWindow 视图模型的属性(例如 MainVm.ucVm)。然后,将 UserControl1 的 DataContext 属性绑定到它:

猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2020-01-27
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2010-12-15
  • 2013-10-18
相关资源
最近更新 更多