我正在尝试在几个文本框上实现WPF验证。我希望能够以比工具提示更明显但比对话框或消息框更微妙的方式向用户显示验证错误。我选择使用Popup类来显示错误,而不是一些内置的文本框,因为有许多需要以这种方式进行验证的不同字段,并且我希望反馈与相关的字段“相连”。
我遇到的问题是,Popup的子TextBox绑定到附加的TextBox(Validation.Errors)属性的更新不够积极。只要出现错误对象,文本就会被更新和显示(例如,对于空字段,“请输入名称。”),但是如果错误更改(例如,用户输入无效文本),弹出窗口中的消息保持不变...直到/除非他们输入有效输入,此时弹出窗口消失。
我已经进行了一些调试,并发现虽然验证规则被正确调用并返回正确的结果,但是Popup的转换器仅在创建初始错误时才被调用。我想我的困惑是为什么Popup仅在验证状态从“没有错误”到“一些错误”(可以这么说)时得到更新。是否有人知道一种强制将更改反映在我的Popup的TextBox.Text中的方法?
以下是我编写的XAML示例。
我遇到的问题是,Popup的子TextBox绑定到附加的TextBox(Validation.Errors)属性的更新不够积极。只要出现错误对象,文本就会被更新和显示(例如,对于空字段,“请输入名称。”),但是如果错误更改(例如,用户输入无效文本),弹出窗口中的消息保持不变...直到/除非他们输入有效输入,此时弹出窗口消失。
我已经进行了一些调试,并发现虽然验证规则被正确调用并返回正确的结果,但是Popup的转换器仅在创建初始错误时才被调用。我想我的困惑是为什么Popup仅在验证状态从“没有错误”到“一些错误”(可以这么说)时得到更新。是否有人知道一种强制将更改反映在我的Popup的TextBox.Text中的方法?
以下是我编写的XAML示例。
<TextBox Name="MyTextBox">
<TextBox.Text>
<Binding Path="MyText" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<local:MyTextBoxValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Popup Name="MyPopup" IsOpen="{Binding ElementName=MyTextBox,
Path=(Validation.HasError), Mode=OneWay}">
<Border BorderThickness="1" BorderBrush="Red" Background="White">
<TextBlock Foreground="Red" Margin="5 5 5 5"
Text="{Binding ElementName=MyTextBox, Path=(Validation.Errors),
Converter={StaticResource errorsToMessageConverter}}"/>
</Border>
</Popup>