RelayCommand&DelegateCommand 小例子看区别

一个小例子,用来展示wpf中的RelayCommand和DelegateCommand区别。

我当时是看了这篇 RoutedComand\RelayCommand\DelegateCommand 的实现比较 文章后知道的这个区别,所以贴在这里。

下面的RelayCommand类和DelegateCommand类都是照着文中的代码写的,故不再贴出。


View

RelayCommand&DelegateCommand 小例子看区别_第1张图片

  • Can Click
    RelayCommand&DelegateCommand 小例子看区别_第2张图片

  • Relay Command Click Me
    click1

  • Delegate Command Update & Click Me
    click2

ViewModel

  • 下拉列表数据源

  • 下拉列表选中的值

  • RelayClick按钮Command

    这里写图片描述

  • DelegateClick按钮Command

  • 两个Click Me按钮共同绑定的Command方法CanClick和OnClick
    RelayCommand&DelegateCommand 小例子看区别_第3张图片

  • UpdateDelegateClickState按钮Command以及方法
    RelayCommand&DelegateCommand 小例子看区别_第4张图片

由于这里不涉及Command的CanExecute判断,所以没必要区分RelayCommand或DelegateCommand

也就是说,这两种Command实现类型只在ICommand接口中的CanExecute方法的调用过程上有区别

// Summary:
// Defines the method that determines whether the command can execute in its
// current state.
//
// Parameters:
// parameter:
// Data used by the command. If the command does not require data to be passed,
// this object can be set to null.
//
// Returns:
// true if this command can be executed; otherwise, false.
bool CanExecute(object parameter);


直接看结果

运行

RelayCommand&DelegateCommand 小例子看区别_第5张图片

两个按钮都是不可用状态,也就是两个ICommand的CanExecute方法都返回下拉列表所选项对应的值false

然后选择下拉列表的Ture选项
RelayCommand&DelegateCommand 小例子看区别_第6张图片

此时,RelayCommand自动更新了按钮的可用状态,而DelegateCommand那边的按钮状态没有更新。

接下来手动更新DelegateCommand按钮的可用状态

点击Update按钮
RelayCommand&DelegateCommand 小例子看区别_第7张图片

DelegateCommand按钮的可用状态变为了可用,即DelegateCommand调用了CanExecute方法,更新了其状态。

同样地,再选择下拉列表的False选项
RelayCommand&DelegateCommand 小例子看区别_第8张图片

同样是RelayCommand那边自动更新,而DelegateCommand这边还是之前的状态。

点击Update按钮进行更新
RelayCommand&DelegateCommand 小例子看区别_第9张图片


例子就到这里,具体的代码原理部分网上很多,就不说了。


本文所用示例项目

你可能感兴趣的:(杂记)