重构导致无法解析符号' RoutedUICommand'

时间:2014-02-05 20:22:12

标签: c# .net wpf dependencies class-library

情况:

我已经开始在WPF项目中编写模型及其命令,现在我决定将这个'模型'移动到类库中,因此它不依赖于任何WPF类型。

最终目标是能够在WPF,例如Forms之外的其他框架上使用它。

对于模型而言,它是无痛的,在任何WPF类型上都没有依赖关系,但是模型命令类返回了一堆错误:无法解析符号'RoutedUICommand'

以下是该课程的摘录:

public static class MyModelCommands
{
    private static readonly RoutedUICommand _addFiles;

    static MyModelCommands()
    {
        _addFiles = new RoutedUICommand("Add files", "AddFiles", typeof (MyModelCommands));
    }

    public static RoutedUICommand AddFiles
    {
        get { return _addFiles; }
    }

    // ...
}

查看RoutedUICommand文档:

RoutedCommand上的Execute和CanExecute方法不包含命令的命令逻辑,就像典型的ICommand一样。 RoutedCommand上的Execute和CanExecute方法不包含命令的命令逻辑,就像典型的ICommand一样。

我得出的结论是,我应该使用自己的ICommand派生,我甚至可以从中获益,因为我将在类库中实现命令逻辑,这很棒。

但是,对于WPF项目,我应该创建一个包含RoutedUICommand中的这些命令的类的外观,并将我的CommandBindings更新为类库中的处理程序吗?

2 个答案:

答案 0 :(得分:1)

RoutedUICommand类是一个UI类,用于视图及其代码或视图模型。您的模型类不应包含任何ICommand字段或属性。如何在UI中显示或编辑模型您的模型类的关注点。这是为了保持UI层与业务模型层之间的分离。

当您按照模式进行操作时,可以为相同的模型类提供不同的UI。例如,如果要为模型添加WinForms UI,则只需使用其事件系统来提供功能,因此不需要ICommand。而不是尝试使用您自己的自定义命令逻辑重新创建轮子,只需使用您使用的任何框架上可用的任何方法。

答案 1 :(得分:1)

关于RoutedCommand的特殊之处在于它是使用命令管理器构建的,

例如:

1)CommandManager.RequerySuggested以引发ICommand.CanExecuteChanged。

2)CommandManager.RegisterClassCommandBindings,以便将命令与特定类型的实例的Execute和CanExecute委托相关联。

这些内置解决方案的性能成本很低,如此处所述 A discussion about the fact that CommandManager's RequerySuggested is raised allot

(每次UIElement或其中任何一个祖先获得任何UI通知。)

实现您自己的ICommand并仍然与UI进行交互需要您手动引发CanExecuteChanged事件,以便通知ICommandSource对象(如Button)以提升其命令可以执行委托。

其次,为了以分离的方式附加命令,您必须实现某种方式 CompositeCommand 对象,它是一种命令的事件聚合器。

因为你可以看到它是可能的,但是所有ICommand对象都意味着对应于UI和WPF框架,因此没有必要将它们放在你想要与其他框架工作一起使用的不同类库中