Wpf 文本框中的数据无效--如何禁用我的命令按钮?

Wpf 文本框中的数据无效--如何禁用我的命令按钮?,wpf,view,binding,prism,delegatecommand,Wpf,View,Binding,Prism,Delegatecommand,我基本上有以下情况: <TextBox Text="{Binding MyIntValue}" /> <Button prism:Click.Command={Binding MyCommand}" /> 当MyIntValue更改时,必须引发命令的can execute changed事件。当MyIntValue更改时,必须引发命令的can execute changed事件。如果MyIntValue属性为int类型,则当输入为25A时,绑定将永远不会更新 解决这个

我基本上有以下情况:

<TextBox Text="{Binding MyIntValue}" />
<Button prism:Click.Command={Binding MyCommand}" />


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

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

如果MyIntValue属性为int类型,则当输入为25A时,绑定将永远不会更新

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

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

编辑:

即使我的ViewModel是正确的,如何基于存在任何绑定问题禁用按钮

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

编辑:
另一个解决方案是防止输入错误。因此,掩码或regextbox行为也应该起作用。

如果MyIntValue属性为int类型,则当输入为25A时,绑定将永远不会更新

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

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

编辑:

即使我的ViewModel是正确的,如何基于存在任何绑定问题禁用按钮

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

编辑:
另一个解决方案是防止输入错误。因此,屏蔽或regextbox行为也应该起作用。

commandbinding是单向的,因此updatesourcetrigger是无用的。问题是MyIntValue绑定不是命令绑定我同意@blindmeis,UpdateSourceTrigger
属于另一个绑定。commandbinding是单向的,因此UpdateSourceTrigger是无用的。问题是MyIntValue绑定而不是命令绑定我同意@blindmeis,
UpdateSourceTrigger
属于另一个绑定。如果您遵循MVVM,强制ViewModel解释视图上可能的错误是不好的。你的虚拟机不应该改变它的属性为字符串,然后做一些黑客转换回一个Int只是为了安抚一个视图。很抱歉,您认为这个解决方案是一个打破mvvm设计模式的有效解决方案。相反,用户确实需要一种方法来保持按钮处于禁用状态,即使ViewModel将命令的CanExecute提升为true。我不这么认为,VM仅用于视图,VM应该为我的视图执行我需要的操作。该模型仍然具有int属性,因此一切正常。我真正不喜欢的是视图和虚拟机不同步。顺便问一下,为什么这会破坏MVVM模式?因为您建议在ViewModel中编写逻辑来说明视图。viewmodel的工作不是担心视图是否存在绑定错误。例如,如果要更改项目的可见性,则不在ViewModel上将布尔值转换为可见性类型,而是在视图上进行转换。如果遵循MVVM,则强制ViewModel解释视图上可能出现的错误是不好的。你的虚拟机不应该改变它的属性为字符串,然后做一些黑客转换回一个Int只是为了安抚一个视图。很抱歉,您认为这个解决方案是一个打破mvvm设计模式的有效解决方案。相反,用户确实需要一种方法来保持按钮处于禁用状态,即使ViewModel将命令的CanExecute提升为true。我不这么认为,VM仅用于视图,VM应该为我的视图执行我需要的操作。该模型仍然具有int属性,因此一切正常。我真正不喜欢的是视图和虚拟机不同步。顺便问一下,为什么这会破坏MVVM模式?因为您建议在ViewModel中编写逻辑来说明视图。viewmodel的工作不是担心视图是否存在绑定错误。例如,如果要更改项目的可见性,则不需要在ViewModel上将布尔值转换为可见性类型,而是在视图上进行转换。。。OP在问:
我如何才能禁用按钮,无论CanExecute是否返回真/假?
也就是说,一些逻辑只属于视图层(答案不应该涉及更改他的ViewModel)。基本上,对于任何想知道。。。OP询问:
我如何禁用按钮以确定CanExecute是否返回真/假?
即,某些逻辑仅属于视图层(答案不应涉及更改其ViewModel)。
<Button prism:Click.Command={Binding MyCommand, 
    UpdateSourceTrigger=PropertyChanged}" />