Mvvm CanExecute和CanExecuteChanged,我必须用RelayCommand实现这些?

Mvvm CanExecute和CanExecuteChanged,我必须用RelayCommand实现这些?,mvvm,mvvm-light,relaycommand,canexecute,Mvvm,Mvvm Light,Relaycommand,Canexecute,我正在使用MVVM Light,我的中继命令工作得很好,我刚刚读到我应该实现CanExecuteChanged和CanExecute。虽然我找不到一个好的例子 有没有人有一个很好的例子来说明如何实现这些 CanExecute在无法执行时需要返回False,但不只是取消按钮 何时执行CanExecuteChanged 任何人都有任何关于何时使用每一项的好例子,我的代码在没有任何说明的情况下工作,但是post声明我应该实现这些项目 我有点困惑,正如我所说,我想我应该将Enabled属性或其他东西绑定

我正在使用MVVM Light,我的中继命令工作得很好,我刚刚读到我应该实现
CanExecuteChanged
CanExecute
。虽然我找不到一个好的例子

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

CanExecute在无法执行时需要返回False,但不只是取消按钮

何时执行
CanExecuteChanged

任何人都有任何关于何时使用每一项的好例子,我的代码在没有任何说明的情况下工作,但是post声明我应该实现这些项目

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

任何有助于理解的帮助都将不胜感激

编辑

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

这在我的viewmodel的构造函数中运行

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

        CanExecuteMe = false;
下面是我的代码的其余部分,我从一个示例中获取

    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

  <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>

当按钮需要确定是否应启用时,将调用CanExecute

该按钮在绑定时执行此操作,每次CanExecuteChanged激发后(该按钮侦听此事件以获取其命令)

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


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

您应该非常小心地使用CanExecute谓词。它检查每个用户界面的变化和输入任何字段的每个键盘键


这可能会导致性能问题

谢谢威尔,好的,我已经让它工作了,并且确保按钮不会执行,因为它返回false。但按钮“仍然”启用。。。我将用我的代码更新我的问题。。也许我做错了什么。好吧,找到它,我必须设置一个名为MustToggleIsEnabledValue的属性。。我将把这个问题标记为已回答,因为这个回答基本上回答了我的问题。@Martin你应该在问题编辑中添加关于MustToggleIsEnabled的内容,我刚刚花了一个小时试图弄清楚