繁体   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