簡體   English   中英

僅使用MVVM Light在單獨的類中實現ICommand實現?

[英]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公開該類的實例。 具有PrintCommandCancelPrintCommand在此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM