【发布时间】:2015-02-25 18:04:50
【问题描述】:
我正在构建一个带有自定义对话框控件的 MVVM WPF 应用程序,该控件位于主窗口中并由其管理。我希望能够从应用程序中的任何位置启动此对话框(例如,从某个地方属于某个子视图的视图模型)。
我的问题是:我可以使用冒泡的 RoutedCommand 或 RoutedEvent 以某种方式从某些子视图的视图模型中的逻辑到主窗口并显示对话框,利用元素树和 WPF 的路由系统,而不是将事物紧密耦合在一起?例如,我有一个 ViewModelBase,并且希望能够从任何地方调用 ViewModelBase.ShowDialog() 并在主窗口中触发对话逻辑。
我觉得这可能会奏效,但我不太明白。和其他人一样,所有关于如何使用 RoutedCommand 来复制粘贴菜单项幸福的文献都让我不知所措。我已经为类似的事情构建了事件聚合器,并且我知道带有消息总线的 MVVM 框架已经存在 - 但如果有自然的方法,我想利用 WPF 内置插件而不是另一种一次性解决方案。
编辑:明确地说,我想避免引入额外的依赖项或框架,例如 Prism。
编辑 2:使用下面 III 答案中的想法使其工作。这是我用来连接它的确切方法:
Commands.cs:提供静态单例命令对象。
// Static class exposing singleton RoutedCommand objects.
public static class Commands
{
public static readonly ICommand ShowDialog = new RoutedCommand();
}
MainWindow.xaml:通过 Window.CommandBindings 将其连接到事件处理程序。
<Window xmlns:common="(namespace containing static Commands class)">
<Window.CommandBindings>
<CommandBinding Command="{x:Static common:Commands.ShowDialog}" Executed="ShowDialog_Executed" />
</Window.CommandBindings>
</Window>
MainWindow.xaml.cs
public void ShowDialog_Executed(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
{
// handle command
}
ViewModelBase.cs:代表调用者启动 RoutedCommand 的代码。
protected void ShowDialog()
{
Commands.ShowDialog.Execute(...); // Can pass dialog text through here.
}
【问题讨论】:
-
您是否将绑定到您的命令的模式设置为双向绑定?
标签: wpf mvvm routed-events routed-commands