更新属性时未读取ICommand谓词

时间:2017-12-04 14:31:05

标签: c# wpf icommand

在我用于控制串行通信总线上的一个或多个设备的应用程序中,我使用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,按钮也会被禁用。单击“查看”时,按钮立即启用。

enter image description here

1 个答案:

答案 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!");
                }
            }
        }
    }
}