关于 mvvm:CanExecute 和 CanExecuteChanged,我必须用 RelayCommand 来实现这些吗?

CanExecute and CanExecuteChanged, I must implement these with a RelayCommand?

我正在使用 MVVM-Light,并且我的中继命令运行良好,我刚刚读到我应该实现 CanExecuteChangedCanExecute。虽然我找不到一个很好的例子。

有没有人有一个很好的例子来说明如何实现这些。

CanExecute 在无法执行时需要返回 False 但不会只是禁用按钮 ??

我什么时候执行 CanExecuteChanged?

任何人都有任何关于何时使用每一个的好例子,我的代码在没有的情况下也可以工作,但这篇博文指出我应该实现这些项目。

我有点困惑,正如我所说的,我想我只是将 Enabled 属性或其他东西绑定到 ViewModel 中的属性,以便我可以禁用按钮或类似控件?

任何帮助理解将非常感激。

编辑

这就是我现在所拥有的...它可以正常工作,但按钮并未物理禁用,只是命令没有运行,因为我返回 false。我在构造函数中调用 CanExecuteMe 以强制 RaiseCanExecuteChanged 运行 ...

这在我的视图模型的构造器中运行

1
2
3
        this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);

        CanExecuteMe = false;

这是我的其余代码,我从一个示例中获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    private bool _canIncrement = true;

    public bool CanExecuteMe
    {
        get
        {
            return _canIncrement;
        }

        set
        {
            if (_canIncrement == value)
            {
                return;
            }

            _canIncrement = value;

            // Update bindings, no broadcast
            //RaisePropertyChanged(CanIncrementPropertyName);

            Page2Command.RaiseCanExecuteChanged();
        }
    }

    public RelayCommand Page2Command
    {
        get;
        private set;
    }

    private object GoToPage2()
    {
        System.Windows.MessageBox.Show("Navigate to Page 2!");
        return null;
    }

这是我的 XAML

1
2
3
4
5
6
7
  <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="31,77,0,0" x:Name="button1" VerticalAlignment="Top" Width="75">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Page2Command, Mode=OneWay}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

当 Button 需要确定是否应该启用它时调用CanExecute。

Button 在绑定时执行此操作,并且在每次 CanExecuteChanged 触发后(Button 侦听此事件以获取其命令)。

所以,如果按钮应该被禁用,你应该触发 CanExecuteChanged,当按钮调用 CanExecute 时,你应该返回 false。这是使用命令绑定时启用/禁用按钮的首选方法。

命令绑定使您能够将所有按钮逻辑封装在一个实例(命令)中。 CanExecute 方法应查询应用程序的当前状态以确定是否应启用或禁用按钮。通过这种封装,您可以减少视图模型中的意大利面条式代码,这些检查在这里和那里和那里执行,我忘记了那里的那个。


您应该非常小心地使用 CanExecute 谓词。它会检查每个 UI 更改以及输入到 ANY 字段中的每个键盘键。

这可能会导致性能问题!