2014-03-03 64 views
0

我們有一個功能強大的應用程序。功能區按鈕都綁定到我的主視圖模型(主應用程序窗口的數據上下文)中的命令。ICommand實現在單獨的類中,僅使用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,然後創建單獨的命令?因爲我想按照this question「標準友好」。

是否有一個標準的ICommand實現我可以使用,以便我的命令在不同的類中?

由於我已經在使用MVVM Light,所以我不想添加更多的MVVM框架。但我也不想重新發明輪子。

更新:MainViewModel.cs不需要混雜在#分區或命令方法的分數。擴展方法不適合恕我直言。

+0

如何創建一個命令和內部commandparameter您指定將用於if語句是一個命令的執行方法內的條件? –

+0

@devhedgehog我正在尋找將每個命令分成它自己的類,但以一種不反對已建立的MVVM約定或MVVM Light的工具的方式(請參閱鏈接問題)。 –

回答

1

我的方式是我有「子視圖模型」。例如,對於MainViewModel,假設您有一個PrintCommand和一個CancelPrintCommand。您可以擁有一個名爲PrinterViewModel的新類,並在MainViewModel中公開此類的一個實例。 PrintCommandCancelPrintCommand在這PrinterViewModel(這也允許模塊單元測試,這是整潔)。

然後在XAML:

Command="{Binding Main.Printer.PrintCommand}" 

或者,你可以做

new RelayCommand(() => Printer.DoSomething()) 

這是否有意義?

乾杯 洛朗

0

你至少可以在getter中創建它們。 你可以使用??運營商。

http://msdn.microsoft.com/en-us/library/ms173224.aspx

這基本上說:返回_testCommand,但首先創建它,如果它仍然無效。

這樣,直到需要時纔會創建該命令!

如果您的目標是整理,您可以使用#region和#endregion。就像我們所說的,如果你的目標是縮小構建過程,使用??在getter中的操作符。如果您只是討厭內聯代碼,請在getter中與RelayCommand一起創建私有方法。

+0

誠然,這可能會更清潔一些;我真正想要做的是在自己的類中實現每個命令,以便MainViewModel.cs不會變得很大。我想知道是否有一個「接受」的方式來做到這一點。我正在使用的MVVM框架(MVVM Light)似乎沒有支持這個功能,而無需滾動自己的ICommand實現。 –

+0

這聽起來對我來說很好。 或者,也許,爲了避免寫一個新的RelayCommand ...你不能在MVVM Light的RelayCommand的base構造函數中傳遞委託方法嗎? – Mtihc

+0

我的意思是,寫一個'RelayCommand'的子類,叫做'OpenProjectCommand'。並在你的'OpenProjectCommand'類中傳入一個'method'作爲它的'base'構造函數的參數。 – Mtihc