2017-10-15 56 views
3

我正在使用C#-WPF-App。如何从C#代码中调用命令,而不是通过将UI控件绑定到它?

当按下窗口中的某个按钮时,将加载模块。这是因为按钮的命令属性绑定到类“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#代码中调用该命令?

+1

为什么你不把抽象的命令抽象到另一个类中,以便在任何地方重用它? – Crowcoder

+0

LoadModuleCommand调用一些函数xyz()...我使这个函数(即xyz()函数)公开和静态,然后试图在if块内调用它。没有错误信息,但模块没有加载......我不知道为什么它不起作用 –

回答

1

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

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

var viewModel = (ConfigureViewModel)DataContext; 
if (viewModel.LoadModuleCommand.CanExecute(null)) 
{ 
    viewModel.LoadModuleCommand.Execute(null); 
} 

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

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

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

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

相关问题