2017-10-15 55 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執行命令,並在那裏進行檢查。

相關問題