C# 从不同的ViewModels执行相同的Prism命令

C# 从不同的ViewModels执行相同的Prism命令,c#,wpf,mvvm,prism,C#,Wpf,Mvvm,Prism,是否可以使用Prism从WPF应用程序中的不同ViewModels执行一个命令 让我解释一下我的意思 我有MainMenuViewModel类: public class MainMenuViewModel { private ICommand _aboutCommand; public ICommand AboutCommand { get { if (_aboutCommand == null)

是否可以使用Prism从WPF应用程序中的不同ViewModels执行一个命令

让我解释一下我的意思

我有MainMenuViewModel类:

public class MainMenuViewModel
{
    private ICommand _aboutCommand;
    public ICommand AboutCommand
    {
        get
        {
            if (_aboutCommand == null)
            {
                _aboutCommand = new DelegateCommand(() => 
                    { MessageBox.Show("About menu item clicked!"); });
            }

            return _aboutCommand;
        }
    }
}
还有此模型的视图:

<Menu IsMainMenu="True">
    <MenuItem Header="Nápověda">
        <MenuItem Header="O Aplikaci" x:Name="About" 
                  Command="{Binding AboutCommand}" />
    </MenuItem>
</Menu>
此模块具有以下视图:

<StackPanel Background="White" HorizontalAlignment="Center" VerticalAlignment="Top">
    <Button cmd:Click.Command="{Binding AboutCommandInAnotherModule}">About</Button>
</StackPanel>

关于
有可能避免重复的代码吗


另外,我知道,我可以为这两个ViewModels创建基类并在那里描述这些命令,但问题是,一些ViewModels已经有了不同的基类。

使用EventAggregator引发类似这样的事件。这允许您在UI的不同区域之间进行松散耦合的通信

发布/订阅概念,通过实现CompositeEvent对象传递数据,效果良好

或者,您可以使您的命令保持静态,并从不同的区域访问它,但这似乎并不那么好

详细说明你的选择


希望能有所帮助。

也许您可以将AboutCommand重构为一个单独的类/对象,然后将其注入两个视图模型(构造函数、setter…)。这样,每个viewmodel都只会传递一个对command对象的引用,并且会以从主viewmodel“外包”AboutCommand逻辑的价格提供重复的代码

另一种更静态的方法是使用包含CompositeCommand的命令代理,例如AboutCommand。您可以在任何地方注册about命令的(或多个)实现


希望这能有所帮助。

我知道EventAggregator,但在这种情况下避免重复代码是没有帮助的。是的,它确实。。。MainMenuViewModel将实现显示“关于”菜单的代码。它还将订阅一个名为“AboutCommandFireed”的事件,并且市政或视图模型将发布该事件。在MainMenuViewModel中,您可能还需要将实现移出匿名方法,以便可以从DelegateCommand和事件聚合器调用它。但在这种情况下,我仍然应该复制用于创建命令的代码,并为视图分配不同的命令。我的问题是,是否可以对不同的视图使用相同的命令实现。
<StackPanel Background="White" HorizontalAlignment="Center" VerticalAlignment="Top">
    <Button cmd:Click.Command="{Binding AboutCommandInAnotherModule}">About</Button>
</StackPanel>