0

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

我在 Prism 中使用 DelegateCommand,它工作正常,除非我将委托分配给 CanExecute 方法。在另一个视图模型中,我有一个事件,它需要一个我正在发布的布尔值,我可以看到该事件正在触发,并且布尔值正在通过其中的命令传递给我的视图模型没问题,但这就是我所做的'不明白……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 不是真的?

如果有人可以向我指出一个很棒的工作示例。

好,谢谢!

4

2 回答 2

0

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

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

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

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

OnNavigationEnabledChange改变它的触发器nextButtonEnabled 就是它的工作方式......

于 2010-12-04T05:11:24.377 回答
0

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

所以我总是最终写出这样的东西:

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 一样。)

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

于 2010-12-03T08:52:30.973 回答