【问题标题】:How to update parent ViewModel property from child view model如何从子视图模型更新父 ViewModel 属性
【发布时间】:2013-02-13 15:43:51
【问题描述】:

我有一个视图窗口,其中包含选项卡控件,每个选项卡内都有不同的用户控件。窗口有自己的视图模型,每个用户控件也是如此。现在如何从任何子用户控件视图模型更新主窗口视图模型的属性?

【问题讨论】:

  • 一,分享您的代码以展示其所有设置。第二,你这样做是错误的。你正常地从父母到孩子,而不是相反。无论如何,如果没有看到您的设置就无法回答。
  • 虽然从技术上讲,您可以将父控件的引用传递给所有子控件,但我认为这通常是不受欢迎的。一个更好的想法可能是从子控件中触发一个事件,父控件可以捕获并对其采取行动。
  • 嗯,我发现最简单的方法是使用事件。在子节点创建一个事件,然后在父节点使用它。

标签: wpf viewmodel parent-child communication


【解决方案1】:

您好,如果您从父视图模型实例化子视图模型,那么您可以通过从子视图模型触发事件并在父视图模型上侦听该事件并更新父视图模型的所需属性来实现。但是,如果您从视图(即您的 userControl)实例化您的 ViewModel,那么您需要在 UserControl 中创建 DependencyProperty 并将其绑定到父视图模型和子 ViewModel 属性,但它确实有一个问题,您只能将一个属性绑定到 xaml 中的目标属性和必须从 DependencyProperty 的 ValueChanged 更新子 ViewModel 属性。我希望这会给你一个想法。

【讨论】:

    【解决方案2】:

    我的AddUser UserControl 孩子:

    public event EventHandler<RoutedEventArgs> SaveUser;
    
    // Wherever I want that event to be launched I write this:
    private void buttonSaveUser_Click(object sender, RoutedEventArgs e)
    {
        EventHandler<RoutedEventArgs> handler = SaveUser;
        handler(this, userEventArgs);
    }
    

    在您的MainWindow.xaml,一旦您创建了您的UserControl 孩子,请订阅该事件:

    addUser = new F7AddUser();
    addUser.SaveUser += AddUser;
    

    然后创建新的AddUser 方法(这个方法必须在您的MainWindow.xaml)。请注意,因为这个来自event,所以参数必须与启动它的事件相同:

    private void AddUser(object o, RoutedEventArgs e)
    {
        // Stuff here
    }
    

    【讨论】:

    • 虽然基于事件的方法似乎是一个很好的解决方案,但我更喜欢使用 MVVM Light Messenger 方法,它似乎是一种更简洁的机制。因为在我的情况下,VM 是相互独立的(即没有 VM 持有其他 VM 的引用),所以我选择使用这种方法。请证明我使用这种方法的合理性。这是一个好习惯还是坏习惯?
    • 不,这不是更好的用法。如果你不使用 MVVM 就是这样;)
    猜你喜欢
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多