WPF验证结果弹出窗口

3
我正在尝试在几个文本框上实现WPF验证。我希望能够以比工具提示更明显但比对话框或消息框更微妙的方式向用户显示验证错误。我选择使用Popup类来显示错误,而不是一些内置的文本框,因为有许多需要以这种方式进行验证的不同字段,并且我希望反馈与相关的字段“相连”。
我遇到的问题是,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>
2个回答

1

我成功地找到了一个妥协。我改变了弹出窗口的TextBlock绑定,如下所示:

<TextBlock Name="MyPopupTextBox" Foreground="Red" Margin="5 5 5 5" 
    Text="{Binding ElementName=MyTextBox, Path=(Validation.Errors)[0].ErrorContent, 
    UpdateSourceTrigger=PropertyChanged, Mode=OneWay, NotifyOnValidationError=True, 
    NotifyOnSourceUpdated=True, ValidatesOnExceptions=True}"/>

0

你的问题是绑定到集合时的典型问题:只要集合在结构上没有变化(插入/删除/清除),绑定就不会更新。因此,如果集合中只有一个项目更改了某个属性,则这不会导致绑定更新。

你已经通过绑定到集合中的元素来解决了这个问题,这样绑定将观察到更改属性(ErrorContent)的完整路径。

使用绑定(Validation.Errors)[0]的问题是,如果Error-Collection为空,它会引发IndexOutOfRange异常(未抛出,但确实存在)。

这个线程讨论了这个异常,并包含了一个对我来说很好的解决方法: http://social.msdn.microsoft.com/forums/en/wpf/thread/1c6cd214-abce-4a8b-a919-0726dd81461a/ 只需将(Validation.Errors)[0].ErrorContent替换为(Validation.Errors).CurrentItem.ErrorContent即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接