分离视图,命令演示(文本,图标)和命令逻辑(执行,CanExecute)

Ath*_*ari 7 c# wpf xaml routed-commands mvvm

如果TL; DR:见最后一段.

Pure WPF"建议"将表示(控件,文本,图标)放入视图和命令逻辑(Execute,CanExecute方法)到代码隐藏中.除了将逻辑放入视图(CommandBindings)和代码隐藏是一个不受欢迎的练习之外,它对XAML重复没有任何帮助:每次命令都必须复制文本,图标,大图标,提示和许多其他属性用于:主菜单,上下文菜单,工具栏按钮,功能区按钮和其他控件.

看起来像第一个问题(真正分离的观点和逻辑)被解决DelegateCommand,RelayCommand并且接近这样.命令逻辑被移动到ViewModels(或MVVMC中的控制器),代码隐藏是清晰的,没有CommandBindings和其他无意义的视图.

但是,我找不到一个普遍接受的演示文稿重复问题的解决方案.我想分离命令演示(文本,图标)和命令逻辑(Execute,CanExecute方法).所有的代码,我能找到要么把文稿分为代码(通过创建一个RoutedCommand与像附加属性LabelIcon),或者把代码放到呈现(即,处理到的意见和代码隐藏).我也不喜欢.我认为演示应该完全在XAML中,代码应该完全在CS中(在ViewModel或Controller中).

问题:如何分离视图(XAML与对照其参考命令),命令呈现(标签,图标等等.对每一个指令)和(为C#代码命令的逻辑Execute,CanExecute在的ViewModels或控制器等)?

Col*_*inE 4

这个问题没有内置的解决方案,您必须卷起袖子自己创建所需的结构。

在我最近从事的一个项目中,我正是这样做的。我创建了一个称为“操作”的概念,它用其他视觉属性补充了 WPF ICommand。事情是这样的......

interface IAction
{
  ICommand Command { get; }
  string DisplayText { get; }
  string ToolTipText{ get; }
  URI Icon { get; }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序包含实例的集合Action。然后可以将它们绑定到菜单、工具栏等...允许同一Action实例以各种不同的呈现样式重新使用。这都是相当简单的 MVVM 内容!