【问题标题】:Can execute question using delegate commands in prism可以使用 prism 中的委托命令执行问题
【发布时间】:2010-12-02 17:13:14
【问题描述】:

这似乎是一个愚蠢的问题,但我查看了有关 prism 的文档并搜索了互联网,但找不到示例……这是交易。

我在 Prism 中使用 DelegateCommand,它工作正常,除非我将委托分配给 CanExecute 方法。在另一个视图模型中,我有一个事件,它需要一个我正在发布的 bool,我可以看到该事件正在触发,并且 bool 正在通过其中的命令传递给我的视图模型没问题,但这就是我所做的'不明白……execute怎么知道状态变了?这是示例的一些代码。

从视图模型ctor

eventAggregator.GetEvent<NavigationEnabledEvent>().Subscribe(OnNavigationEnabledChange, ThreadOption.UIThread);

NavigateCommand = new DelegateCommand(OnNavigate, () => nextButtonEnabled);

现在 - 这是 OnNavigationEnableChange 事件。

private void OnNavigationEnabledChange(bool navigationState)
    {
      nextButtonEnabled = navigationState;
    }
enter code here

就像 - 我在这里完全遗漏了一些东西 - 命令如何知道 nextButtonEnabled 不是真的?

如果有人能给我指出一个很棒的工作示例。

好的 - 谢谢!

【问题讨论】:

  • 对您的要求有点困惑...您是否想知道它如何知道何时再次调用 CanExecute 以刷新命令的执行能力?您通过 EventAggregator 进行的事件注册我认为这让事情变得混乱......也许是一个更简洁的代码示例,因为您的事件处理程序与命令处理程序是分开的。
  • 是的,你的第一个问题是正确的......它如何知道通过调用 CanExecute 来刷新命令执行能力?我也只是没说。感谢您的帮助!

标签: mvvm c#-4.0 prism delegatecommand


【解决方案1】:

这就是为什么我不在 Prism 中使用 DelegateCommand 的实现。我一直讨厌启用/禁用命令的基于回调的方法。这是完全没有必要的,据我所知,它唯一的(也是相当可疑的)“好处”是它与执行本身的处理方式一致。但这对我来说似乎一直毫无意义,因为执行和启用/禁用显然非常不同:按钮知道何时要执行命令,但不知道命令的状态何时可能发生变化。

所以我总是这样写:

public class RelayCommand : ICommand
{
    private bool _isEnabled;
    private Action _onExecute;

    public RelayCommand(Action executeHandler)
    {
        _isEnabled = true;
        _onExecute = executeHandler;
    }

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }
    }


    public bool CanExecute(object parameter)
    {
        return _isEnabled;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _onExecute();
    }
}

(如有必要,您可以修改它以使用弱引用来执行更改事件处理程序,就像 Prism 一样。)

但要回答您的问题:回调方法是如何工作的? Prism 的DelegateCommand 提供了一个RaiseCanExecuteChanged 方法,您可以调用它来要求它引发将导致命令调用程序查询您的命令的CanExecute 的事件。鉴于您必须在启用状态更改的任何时候告诉DelegateCommand,我认为基于回调的方法没有任何有意义的好处。 (有时您会看到广播模型 - 安排任何位置的任何状态更改都会通知 所有 命令调用者!在这种情况下,回调很有用,因为这意味着如果您不这样做也没关系知道实际发生了什么变化。但是重新查询每个命令对我来说似乎很不愉快。)

【讨论】:

    【解决方案2】:

    回答您的问题,该命令如何知道它现在已启用:

    NavigateCommand = new DelegateCommand(OnNavigate, () => nextButtonEnabled);
    

    DelegateCommand 构造函数的重载采用 2 个参数: 第一个是命令动作,第二个是返回 bool 的 CanExecute 委托。 在您的示例中,您的 CanExecute 操作始终返回 nextButtonEnabled

    eventAggregator.GetEvent<NavigationEnabledEvent>().Subscribe(OnNavigationEnabledChange, ThreadOption.UIThread);
    

    触发OnNavigationEnabledChange 改变nextButtonEnabled 这就是它的工作原理......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多