【问题标题】:How a command from main window be handled in a usercontrol view model如何在用户控件视图模型中处理来自主窗口的命令
【发布时间】:2011-03-18 20:06:26
【问题描述】:

在我的应用程序中,我在一个窗口中有几个用户控件。这些用户控件需要相互通信。我的方法如下

  1. 用户控件 A 触发将由用户控件 B 处理的命令。
  2. 主窗口接收命令并向 B 发出命令
  3. 用户控件 B 处理命令。

我的问题是主窗口如何触发可以在用户控件 B 的 VIEW MODEL 中处理的命令?

更新:

已解决:一个全局静态 RelayCommand 用于从 MainWindow 到 B 的通信,一个 Global RoutedCommand 用于从 A 到 Main Window 的通信。感谢您的回复。

【问题讨论】:

    标签: wpf mvvm binding


    【解决方案1】:

    这个问题没有被标记为mvvm(还),但我假设它是因为你提到了一个 ViewModel。所以首先,让我们同意 ViewModel 处理命令,而不是控件。如果控件想要响应正在执行的命令,请公开合适的CommandExecuted 事件,控件(视图)可以将处理程序附加到该事件。

    然而,我不能盲目假设另一个未知数:

    您认为用户控件 A 和 B 同时存在是理所当然的吗?如果是,那么一个非常简单且技术含量低的解决方案是在某个级别维护对两个 ViewModel 的引用(也许是 Window 本身的 ViewModel?)并将命令“冒泡”到那里,在那里调度到 ViewModel B 会发生。如果不是(在这种情况下控件 B 可能不存在),期望的行为是什么?

    根据您目前提供的信息,我建议您使用 MVVM 框架的事件聚合器/调解器模式实现。例如,棱镜有EventAggregator; MVVM Light 有Messenger;等等

    【讨论】:

    • 感谢 Jon,+1- 我已经研究了事件聚合器,但无法使用它,因为我在大型应用程序中只做一个模块,而应用程序没有使用任何框架。是的,A 和 B 同时存在,但是维护引用是某种耦合(尽管实际上不会有害),这与我打算做的事情背道而驰。我将尝试处理事件并调用视图模型的视图 - 仍然很糟糕,但没有其他简单的方法。
    • 问题已解决,一个全局静态 RelayCommand 用于从 MainWindow 到 B 的通信,一个 Global RoutedCommand 用于从 A 到 Main Window 的通信。
    【解决方案2】:

    我认为您希望在 B 上拥有一个主窗口可以绑定到的依赖属性。然后,您在 B 上的 DP 将接受请求并将其称为视图模型。

    主窗口不应该知道控件的内部工作原理。它应该只知道控件的公开属性。

    【讨论】:

    • 不能尝试这个,但用不同的方法解决了。一个全局静态 RelayCommand 用于从 MainWindow 到 B 的通信,一个 Global RoutedCommand 用于从 A 到主窗口的通信。
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2013-12-13
    • 2021-06-20
    相关资源
    最近更新 更多