为什么当切换按钮的名称与属性匹配时,它的guard属性会被忽略?

本文关键字:属性 它的 guard 按钮 为什么 | 更新日期: 2023-09-27 18:04:35

当我有一个ToggleButton定义为:

<ToggleButton Name="Taco"/>

在我的ViewModel中:

public void Taco() {}
public bool CanTaco { get { return false; }}

按钮已正确禁用。但是如果我让Taco成为一个bool属性来反映ToggleButton的IsChecked状态,它就会受到CM约定的约束,但是CanTaco属性不再被使用:

public bool Taco { get; set; }
public bool CanTaco { get { return false; } } // completely ignored

按钮已启用。我可以手动绑定IsEnabled到CanTaco,它又能正常工作了。

在这种情况下约定不使用guard属性是有原因的,还是有bug?

为什么当切换按钮的名称与属性匹配时,它的guard属性会被忽略?

这与其说是一个bug,不如说是绑定基础结构的限制。Guard方法针对动作工作,因为我们可以"拦截"方法调用并首先检查Guard。然而,当它是一个属性时,双向绑定就会设置属性,并且没有地方插入检查保护。

如果有这个功能就好了,但不幸的是不可能,保护方法只能使用方法而不能使用属性。