我有一个wpf mvvm应用程序。 视图中有一个按钮,它与视图模型中的命令绑定。 此命令的函数CanExecute返回某些bool属性的值
private bool Command1CanExecute()
{
return IsConnected;
}
当属性发生变化时,该按钮应该被禁用但是在我点击UI中的某个位置之前它没有发生。 我想过的解决方案(并且它可以工作:))是运行
CommandManager.InvalidateRequerySuggested();
每秒(Dispatcher计时器可以执行此操作)。
我的问题还有另一种更优雅的解决方案吗? 谢谢。
玛特威。
答案 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;
}