如何从 C# 代码中调用 Command 而不是通过绑定 UI-control 到它?

How to call Command from within C# code instead of by binding UI-control to it?

我正在开发 C#-WPF-App。

当按下 window 中的某个按钮时,将加载一个模块。发生这种情况是因为按钮的命令 属性 绑定到 class "ConfigureViewModel":

中的 LoadModuleCommand
<Button Command="{Binding LoadModuleCommand}" Margin="10,10,10,10" Grid.Column="1" Content="Add Module" Grid.Row="0" />

出于某种原因,这对于这个问题并不重要,我现在还想从 MainViewModel.cs 文件中调用相同的命令(即 LoadModuleCommand),如果某个条件为真:

 if (id.Equals(Module.Id.ToString()))
        {
             //call the LoadModuleCommand

        }

如果我必须将 LoadModuleCommand 绑定到第二个 UI-control,我知道我必须做什么。但是我如何简单地从 c# 代码中调用命令呢?

有几种方法可以解决您的问题。

一种方法是获取绑定的数据上下文并将其转换。现在你可以执行像

这样的命令了
var viewModel = (ConfigureViewModel)DataContext;
if (viewModel.LoadModuleCommand.CanExecute(null))
{
    viewModel.LoadModuleCommand.Execute(null);
}

请注意,您需要知道数据上下文的类型才能正确转换它。如果可能有多种类型,则使用一个接口。

第二种方法是给按钮命名(例如<Button x:Name="loadModuleButton" .../>)并引发点击事件,如

loadModuleButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));

您说过您有一个从 ConfigureViewModel 和 MainViewModel 调用的函数 xyz()。这个函数应该放在另一个 class 中,你可以在每个视图模型的构造函数中初始化它,或者更好的是,它可以通过依赖注入作为构造函数中的参数发送。您必须向我们发出您为 ConfigureViewModel 执行的命令,也向 MainViewModel 发出命令,然后进行检查。