【问题标题】:CanExecute and CanExecuteChanged, I must implement these with a RelayCommand?CanExecute 和 CanExecuteChanged,我必须用 RelayCommand 实现这些吗?
【发布时间】:2011-08-17 17:37:48
【问题描述】:

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

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

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

什么时候执行CanExecuteChanged

任何人都有任何关于何时使用每个项目的好例子,我的代码可以在没有 this blog 帖子的情况下工作,但我应该实现这些项目。

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

如有任何帮助,将不胜感激。

编辑

这就是我现在所拥有的...它可以工作,但按钮实际上并未禁用,只有当我返回 false 时命令没有运行。我在构造函数中调用 CanExecuteMe 来强制 RaiseCanExecuteChanged 运行......

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

        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>

【问题讨论】:

    标签: mvvm mvvm-light relaycommand canexecute


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,好的,我已经成功了,而且按钮没有执行,因为它返回 false。但是按钮是“STILL”启用...我会用我的代码更新我的问题..也许我做错了什么。
    • 好的,找到了,我必须设置一个名为 MustToggleIsEnabledValue 的属性。我会将这个问题标记为已回答,因为这个回复几乎回答了我的问题。
    • @Martin 你应该把关于 MustToggleIsEnabled 的部分放在问题编辑中,我花了一个小时试图弄清楚
    【解决方案2】:

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

    这可能会导致性能问题!

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多