2

基本上我有以下情况:

<TextBox Text="{Binding MyIntValue}" />
<Button prism:Click.Command={Binding MyCommand}" />
public Boolean CanDoCommand()
{
    return (MyIntValue < 100);
}

public void DoCommand() { ... }

所以问题来了,如果我输入 25 的值,MyCommand 就会启用。之后,如果我将其更改为 25A,按钮仍处于启用状态,因为绑定未更新以反映我的 ViewModel 中的错误。相反,我的视图上只有一个绑定错误。这使 MyCommand 按钮处于启用状态,而 MyIntValue 仍为 25。

即使我的 ViewModel 是正确的,如何根据任何绑定问题禁用按钮?

编辑(海报真正要求的是什么):

无论 CanExecute 方法基于 View 的 BindingError 从 ViewModel 返回什么,如何禁用按钮?

4

3 回答 3

0

如果您的 MyIntValue 属性是 int 类型,那么当您的输入为 25A 时,您的绑定将永远不会更新。

解决此问题的唯一方法是在 VM 端使用字符串类型和 IDataErrorInfo。

另一种方法是使用 typeof Nullable int 和转换器,并在它不是您期望的值时将值设置为 null。

编辑:

即使我的 ViewModel 是正确的,如何根据任何绑定问题禁用按钮?

你的问题是你的虚拟机和你的用户界面不同步。如果您键入 25A,您的 Vm 似乎是正确的,因为它仍然有 25,但您的视图有一个 BindingError。所以你的问题应该是我如何同步我的视图和视图模型。(见我的两个建议)

编辑:另一种解决方案是防止错误输入。所以 Masked 或 RegexTextbox 行为也应该起作用。

于 2011-06-13T15:45:37.637 回答
0
<Button prism:Click.Command={Binding MyCommand, 
    UpdateSourceTrigger=PropertyChanged}" /> 
于 2011-06-13T15:36:55.173 回答
0

当 MyIntValue 更改时,您必须引发命令的 can execute changed 事件。

于 2011-06-13T15:39:22.333 回答