【问题标题】:RelayCommands overriding the "IsEnabled" of my buttonsRelayCommands 覆盖了我的按钮的“IsEnabled”
【发布时间】:2010-04-28 03:23:34
【问题描述】:

RelayCommands 覆盖了我的按钮的“IsEnabled”。

这是一个错误吗?这是我的 View 中的 xaml 和我的 ViewModel 中的代码

<Button Grid.Column="0" Content="Clear" IsEnabled="False" cmd:ButtonBaseExtensions.Command="{Binding ClearCommand}"  />    

public RelayCommand ClearCommand
    {
       get { return new RelayCommand(() => MessageBox.Show("Clear Command")); }
    }

请注意,我在我的 xaml 中硬编码了 IsEnabled="False"。该值被完全忽略(按钮始终启用)。

我意识到 RelayCommand 有一个 CanExecute 重载,但我确实想使用它,因为我想做的不仅仅是拥有一个禁用的按钮。

【问题讨论】:

  • 如果在 IsEnabled 属性上创建单向绑定会发生什么?可能是您问题的解决方案,但不是问题的答案;)
  • 好主意,但没成功!
  • 这把我逼疯了。 +1 理智。过去 29 小时的 24 小时编码。

标签: mvvm-light


【解决方案1】:

这是一个有趣的观点。你是对的, IsEnabled 属性被覆盖。如果 CanExecute 委托未在构造函数中设置,我想一个改进可能是忽略 IsEnabled 属性...我将在下一个版本中考虑它。

同时,使用 CanExecute 委托并将其设置为始终返回 false。

public RelayCommand ClearCommand
{
   get { return new RelayCommand(
       () => MessageBox.Show("Clear Command"),
       () => false); }
}

干杯, 洛朗

【讨论】:

  • 谢谢!我认为这种改变是有意义的。顺便说一句,你的工具包很棒。
【解决方案2】:

这是我的实现...

1) RelayCommand 类声明可以是:

公共类 RelayCommand : ViewModelBase, ICommand

2) IsEnabled 属性的实现如下:

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            if (value != _isEnabled)
            {
                _isEnabled = value;

                OnPropertyChanged("IsEnabled");
            }
        }
    }

3) 最后需要在xaml中绑定IsEnabled属性如下:

IsEnabled="{Binding Path=SearchCommand.IsEnabled}"

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多