在我用于控制串行通信总线上的一个或多个设备的应用程序中,我使用IsAlive
类中的DeviceModel
属性来判断与设备的通信链路已启动(即在预期地址上收到回复)。该属性会触发PropertyChanged
事件通知。
我使用IsAlive
属性来设置数据模板的背景颜色和控制数据模板中按钮的命令谓词。通过拉出通信电缆,我强制链接超时并将IsAlive
设置为false。这在模板背景颜色上工作正常,但按钮在谓词更改上没有响应,直到我点击视图上的任何位置。
知道为什么会这样吗?以及如何在设置IsAlive
属性时立即更新按钮?
C#命令谓词:
private bool CanPressMovementButton(object obj) {
if (IsAlive == true && Address > -1 && Address < 31) {
return true;
}
return false;
}
这是一个屏幕截图,即使IsAlive
属性设置为true
,按钮也会被禁用。单击“查看”时,按钮立即启用。
答案 0 :(得分:1)
在Anton Semenov关于在Prism的DelegateCommand实现中使用RaiseCanExecuteChanged
方法的提示之后,它就像一个魅力。从模型中设置IsAlive
现在可以立即更新View,而无需将焦点放在View上。由于我将根据设备类型支持多种具有不同命令的设备类型,因此我将DelegateCommand
对象设置为:
public bool IsAlive {
get { return _isAlive; }
set {
bool newValue = SetNotify(ref _isAlive, value);
if (newValue) {
var properties = GetType().GetProperties();
foreach (var property in properties) {
if (property != null && property.PropertyType == typeof(DelegateCommand)) {
var command = (DelegateCommand)property.GetValue(this, null);
command.RaiseCanExecuteChanged();
Console.WriteLine("Raised!");
}
}
}
}
}