Wpf UI does not update

本文关键字:update not does UI Wpf | 更新日期: 2023-09-27 18:27:25

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

private bool Command1CanExecute()
{
    return IsConnected;
}

当属性被更改时,按钮应该会被禁用,但直到我单击UI中的某个位置才发生这种情况。我考虑过的解决方案(有效:)是运行

  CommandManager.InvalidateRequerySuggested();

每秒(Dispatcher计时器可以做到)。

对于我的问题,还有其他更优雅的解决方案吗?非常感谢。

马特维。

Wpf UI does not update

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

CommandManager.InvalidateRequerySuggested();

您还可以引发您的命令的CanExecuteChanged事件(它只做上面的事情)

Command1.RaiseCanExecuteChanged();

你可以在IsConnected的setter中插入任何一个,就像下面的一样

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

如果你不想那样,您可以在CanExecute处理程序中返回true,并将按钮的IsEnabled绑定到属性本身。

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

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

和方法:

 [DebuggerStepThrough]
        public Boolean CanExecute(Object parameter)
        {
            var valu = _canExecute == null ? true : _canExecute();
            CommandManager.InvalidateRequerySuggested();
            return valu;
        }