[英]ICommand implementations in a separate classes, using only MVVM Light?
我們有一個帶有功能區的大型應用程序。 功能區按鈕都綁定到我的主視圖模型(主應用程序窗口的數據上下文)中的命令。
隨着我們創建許多RelayCommands(綁定到各種功能區命令),MainViewModel的構造函數開始增長。 看起來像這樣:
public MainWindowViewModel()
{
this.OpenProjectCommand = new RelayCommand(() =>
{
// buncha code
});
this.ProjectTypesCommand = new RelayCommand(() =>
{
// more code
});
this.NewSectionCommand = new RelayCommand(() =>
{
// code code code...
});
// ... only three ribbon buttons down, this is gonna get huge...
}
我希望有單獨的類來實現每個命令,而不是在MainViewModel的構造函數中添加大量內聯代碼。 (或者在MainViewModel中創建很多委托,例如OpenProject,CanOpenProject,然后將對它們的引用傳遞給RelayCommand構造函數)。
為什么我不簡單地在CommandBase中實現ICommand然后創建單獨的命令? 因為按照這個問題,我想成為“標准友好”。
我是否可以使用標准的ICommand實現,以便將命令放在單獨的類中?
我不希望在組合中添加更多的MVVM框架,因為我已經在使用MVVM Light。 但是我也不想重新發明輪子。
更新:MainViewModel.cs不必被數十個#regions或命令方法所困擾。 擴展方法也不適合恕我直言。
我的方式是擁有“ sub-viewmodels”。 例如,對於MainViewModel,我們假設您有一個PrintCommand
和一個CancelPrintCommand
。 您可以擁有一個名為PrinterViewModel
的新類,並在MainViewModel
公開該類的實例。 具有PrintCommand
和CancelPrintCommand
在此PrinterViewModel
(這也允許模塊化單元測試,這是純的)。
然后在XAML中:
Command="{Binding Main.Printer.PrintCommand}"
或者,你可以做
new RelayCommand(() => Printer.DoSomething())
那有意義嗎?
干杯勞倫特
您至少可以在getter中創建它們。 您可以使用?? 運營商。
http://msdn.microsoft.com/en-us/library/ms173224.aspx
基本上是這樣說的:返回_testCommand,但是如果它仍然為null,則首先創建它。
這樣,直到需要它時才創建命令!
public class TestViewModel : ViewModelBase
{
#region OpenCommand
private RelayCommand _testCommand;
public RelayCommand TestCommand {
get {
return _testCommand = _testCommand
?? new RelayCommand(
this.ExecuteOpenCommand,
this.CanOpenCommandExecute);
}
}
private void ExecuteOpenCommand()
{
// do stuff
}
private bool CanOpenCommandExecute()
{
return true;
}
#endregion
}
如果您的目標是組織,則可以使用#region和#endregion。 就像我們說的那樣,如果您的目標是縮短構建過程,請使用? 吸氣劑中的運算符。 如果您只是討厭內聯代碼,請在getters中與RelayCommand結合創建私有方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.