【问题标题】:Refactoring leads to Cannot resolve symbol 'RoutedUICommand'重构导致无法解析符号“RoutedUICommand”
【发布时间】:2014-03-02 11:59:15
【问题描述】:

情况:

我已经开始在 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(s) 中创建包含这些命令的此类的外观,并将我的 CommandBindings 更新为类库中的处理程序?

【问题讨论】:

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


    【解决方案1】:

    RoutedCommand 的特别之处在于它是使用 Command Manager 内置的,

    例如:

    1) CommandManager.Requery 建议引发 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 框架,因此将它们放在您希望与其他框架作品一起使用的不同类库中没有真正意义.

    【讨论】:

      【解决方案2】:

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

      当您遵循 this 模式时,您可以为相同的模型类提供不同的 UI。例如,如果您要为模型添加 WinForms UI,您可以简单地使用它的事件系统来提供功能,因此ICommands 不是必需的。与其尝试使用您自己的自定义命令逻辑重新发明轮子,不如使用您使用的任何框架上可用的任何方法。

      【讨论】:

        猜你喜欢
        • 2022-08-03
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多