Wpf UI不会更新

时间:2014-10-21 08:44:19

标签: c# wpf user-interface mvvm command

我有一个wpf mvvm应用程序。 视图中有一个按钮,它与视图模型中的命令绑定。 此命令的函数CanExecute返回某些bool属性的值

private bool Command1CanExecute()
{
    return IsConnected;
}

当属性发生变化时,该按钮应该被禁用但是在我点击UI中的某个位置之前它没有发生。 我想过的解决方案(并且它可以工作:))是运行

  CommandManager.InvalidateRequerySuggested();

每秒(Dispatcher计时器可以执行此操作)。

我的问题还有另一种更优雅的解决方案吗? 谢谢。

玛特威。

2 个答案:

答案 0 :(得分:1)

所有命令在任何用户交互后都会更新。如果以编程方式更改属性并想要更新命令状态,则必须在属性更改后建议重新查询:

CommandManager.InvalidateRequerySuggested();

你也可以举起你命令的CanExecuteChanged-Event(除了上面的内容之外什么都不做)

Command1.RaiseCanExecuteChanged();

您可以在IsConnected的设置器中插入任何此类内容,如下所示

private bool _isConnected;
public bool IsConnected
{
  get { return _isConnected; }
  set
  {
    if (_isConnected != value)
    { 
      _isConnected = value;
      RaisePropertyChanged(); //or something similar
      Command1.RaiseCanExecuteChanged();
    }
  }
}

如果你不想要, 您可以在CanExecute-Handler中返回true并将按钮的IsEnabled绑定到属性本身。

<Button IsEnabled="{Binding IsConnected}" Command="{Binding Command1}" ... />

答案 1 :(得分:-1)

对于使用MicroMvvm的人,需要将更改应用于班级:public class RelayCommand<T>:ICommand

和方法:

 [DebuggerStepThrough]
        public Boolean CanExecute(Object parameter)
        {

            var valu = _canExecute == null ? true : _canExecute();
            CommandManager.InvalidateRequerySuggested();
            return valu;
        }