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

时间:2012-11-24 18:02:48

标签: c# wpf xaml mvvm routed-commands

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

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

看起来第一个问题(真正分离视图和逻辑)是由DelegateCommandRelayCommand和类似方法解决的。命令逻辑被移动到ViewModels(或MVVMC中的控制器),代码隐藏是干净的,没有CommandBindings和视图中的其他废话。

但是,我找不到一个普遍接受的演示文稿重复问题的解决方案。我想分开命令演示文稿(文本,图标)和命令逻辑ExecuteCanExecute方法)。我可以找到的所有代码都将表示放入代码中(通过创建RoutedCommand以及其他属性,如LabelIcon),或将代码放入表示中(即处理程序进入视图和代码) -背后)。我也不喜欢。我认为演示应该完全在XAML中,代码应该完全在CS中(在ViewModel或Controller中)。

问题:如何分隔视图(XAML与引用命令的控件),命令的显示(每个命令的标签,图标等)和命令逻辑({{1}的C#代码ViewModels或Controllers中的},Execute等?

1 个答案:

答案 0 :(得分:4)

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

在我最近的一个项目中,我做到了这一点。我创建了一个名为'action'的概念,它补充了WPF ICommand和其他视觉属性。这是这样的......

interface IAction
{
  ICommand Command { get; }
  string DisplayText { get; }
  string ToolTipText{ get; }
  URI Icon { get; }
}

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