更新时未读取 ICommand 谓词 属性
ICommand predicate not being read when updating property
在我用于控制串行通信总线上的一个或多个设备的应用程序中,我在 DeviceModel
[=33] 中使用 IsAlive
属性 =] 判断与设备的通信 link 是否正常(即在预期地址上收到回复)。 属性 触发 PropertyChanged
事件通知。
我正在使用 IsAlive
属性 来设置数据模板的背景颜色和控制数据模板中按钮的命令谓词。通过拔出通信电缆,我迫使 link 超时并将 IsAlive
设置为 false。这在模板背景颜色上工作正常,但按钮不会响应谓词更改,直到我单击视图上的任意位置。
知道这是为什么吗?以及如何在设置 IsAlive
属性?
时让按钮立即更新
C# 命令谓词:
private bool CanPressMovementButton(object obj) {
if (IsAlive == true && Address > -1 && Address < 31) {
return true;
}
return false;
}
这是一个屏幕截图,其中即使 IsAlive
属性 设置为 true
,按钮也被禁用。当我单击视图时,按钮立即启用。
在 Anton Semenov 关于在 Prism 的 DelegateCommand 实现中使用 RaiseCanExecuteChanged
方法的提示之后,它非常有效。从模型中设置 IsAlive
现在会立即更新视图,而无需将焦点放在视图上。由于我将根据设备类型使用不同的命令支持多种设备类型,因此我设置 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!");
}
}
}
}
}
在我用于控制串行通信总线上的一个或多个设备的应用程序中,我在 DeviceModel
[=33] 中使用 IsAlive
属性 =] 判断与设备的通信 link 是否正常(即在预期地址上收到回复)。 属性 触发 PropertyChanged
事件通知。
我正在使用 IsAlive
属性 来设置数据模板的背景颜色和控制数据模板中按钮的命令谓词。通过拔出通信电缆,我迫使 link 超时并将 IsAlive
设置为 false。这在模板背景颜色上工作正常,但按钮不会响应谓词更改,直到我单击视图上的任意位置。
知道这是为什么吗?以及如何在设置 IsAlive
属性?
C# 命令谓词:
private bool CanPressMovementButton(object obj) {
if (IsAlive == true && Address > -1 && Address < 31) {
return true;
}
return false;
}
这是一个屏幕截图,其中即使 IsAlive
属性 设置为 true
,按钮也被禁用。当我单击视图时,按钮立即启用。
在 Anton Semenov 关于在 Prism 的 DelegateCommand 实现中使用 RaiseCanExecuteChanged
方法的提示之后,它非常有效。从模型中设置 IsAlive
现在会立即更新视图,而无需将焦点放在视图上。由于我将根据设备类型使用不同的命令支持多种设备类型,因此我设置 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!");
}
}
}
}
}