如何从 C# 代码中调用 Command,而不是通过将 UI 控件绑定到它?

ste*_*ess 5 c# data-binding wpf icommand

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

当按下窗口中的某个按钮时,就会加载一个模块。发生这种情况是因为按钮的 Command 属性绑定到“ConfigureViewModel”类中的 LoadModuleCommand:

<Button Command="{Binding LoadModuleCommand}" Margin="10,10,10,10" Grid.Column="1" Content="Add Module" Grid.Row="0" />
Run Code Online (Sandbox Code Playgroud)

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

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

        }
Run Code Online (Sandbox Code Playgroud)

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

Fru*_*erg 3

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

一种方法是获取绑定的数据上下文并对其进行转换。现在您可以执行如下命令

var viewModel = (ConfigureViewModel)DataContext;
if (viewModel.LoadModuleCommand.CanExecute(null))
{
    viewModel.LoadModuleCommand.Execute(null);
}
Run Code Online (Sandbox Code Playgroud)

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

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

loadModuleButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
Run Code Online (Sandbox Code Playgroud)