[英]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.