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

时间:2017-10-15 17:18:57

标签: c# wpf data-binding 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" />

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

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

        }

如果我必须将LoadModuleCommand绑定到第二个UI控件,我知道我必须做什么。但是我如何从c#-code中调用命令呢?

2 个答案:

答案 0 :(得分:2)

你说你有一个函数xyz(),它是从ConfigureViewModel和MainViewModel调用的。这个函数应该放在另一个可以在每个视图模型的构造函数中初始化的类中,或者更好地通过依赖注入将它作为参数发送到构造函数中。您必须使用您为ConfigureViewModel执行的命令,以及MainViewModel,并在那里进行检查。

答案 1 :(得分:1)

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

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

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

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

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

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