更新时未读取 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!");
                }
            }
        }
    }
}