WPF验证结果弹出窗口

WPF验证结果弹出窗口,wpf,validation,popup,binding,Wpf,Validation,Popup,Binding,我试图在几个文本框上实现WPF验证。我希望能够用比工具提示更明显但比对话框或消息框更微妙的东西向用户显示验证错误。我决定使用Popup类,而不是一些内置的文本框来显示错误,因为有许多不同的字段需要通过这种方式进行验证,我希望反馈“附加”到相关字段 我遇到的问题是,弹出窗口的子文本框绑定到附加文本框的(Validation.Errors)属性的更新不够积极。一旦出现错误对象,文本将被更新和显示(即“请输入名称”。对于空字段),但如果错误发生变化(即用户输入无效文本),弹出窗口中的消息将保持不变。。

我试图在几个文本框上实现WPF验证。我希望能够用比工具提示更明显但比对话框或消息框更微妙的东西向用户显示验证错误。我决定使用Popup类,而不是一些内置的文本框来显示错误,因为有许多不同的字段需要通过这种方式进行验证,我希望反馈“附加”到相关字段

我遇到的问题是,弹出窗口的子文本框绑定到附加文本框的(Validation.Errors)属性的更新不够积极。一旦出现错误对象,文本将被更新和显示(即“请输入名称”。对于空字段),但如果错误发生变化(即用户输入无效文本),弹出窗口中的消息将保持不变。。。除非输入有效输入,否则弹出窗口将根据需要消失

我已经做了一些调试,我发现虽然验证规则被正确调用并返回正确的结果,但是弹出窗口的转换器只在创建初始错误时被调用。我想我感到困惑的是,为什么只有当验证状态从“无错误”变为“某些错误”时,才会更新弹出窗口。是否有人知道强制更改验证的方法。错误将反映在弹出窗口的文本框中。文本

下面是我所写内容的一个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>

我找到了一个折衷方案。我更改了弹出窗口文本块上的绑定,如下所示:

<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}"/>

绑定到集合时,您的原始问题是一个典型问题:只要您的集合在结构上没有更改(插入/删除/清除),绑定将看不到任何更新的理由。因此,如果集合中只有一个项更改了某些属性,则不会导致绑定更新

您已经通过绑定到此集合中的元素解决了这个问题,这样在绑定中就可以观察到已更改属性(ErrorContent)的完整路径

绑定
(Validation.Errors)[0]
的问题在于,如果错误集合为空,它会引发IndexOutfrange异常(不会抛出,但它们在那里)

此线程讨论该异常,并包含一个对我来说很好的解决方法: 只需将
(Validation.Errors)[0].ErrorContent
替换为
(Validation.Errors).CurrentItem.ErrorContent
,您就完成了