C# 如何显示多个IDataErrorInfo';悬停单元格的WPF DataGridTextColumn上的工具提示中出现错误?

C# 如何显示多个IDataErrorInfo';悬停单元格的WPF DataGridTextColumn上的工具提示中出现错误?,c#,datagrid,styles,idataerrorinfo,validationrule,C#,Datagrid,Styles,Idataerrorinfo,Validationrule,我能够为数据网格中的一个特定单元格显示验证错误,但如果存在多个验证错误,我不知道如何执行此操作。例如,我有十列,两个或更多单元格中存在验证错误 目前,我已经在App.xaml包含的单独文件中定义了一个样式作为ResourceDictionary 风格: <Style TargetType="{x:Type DataGridRow}"> <Setter Property="FontSize" Value="16"/> <Setter Property=

我能够为数据网格中的一个特定单元格显示验证错误,但如果存在多个验证错误,我不知道如何执行此操作。例如,我有十列,两个或更多单元格中存在验证错误

目前,我已经在App.xaml包含的单独文件中定义了一个样式作为ResourceDictionary

风格:

<Style TargetType="{x:Type DataGridRow}">
    <Setter Property="FontSize" Value="16"/>
    <Setter Property="FontFamily" Value="ArialMT"/>
    <Setter Property="Height" Value="24"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="ValidationErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <Ellipse Width="12" Height="12" Fill="Red" Stroke="Black" StrokeThickness="0.5"/>
                    <TextBlock FontWeight="Bold" Padding="4,0,0,0" Margin="0" VerticalAlignment="Top" Foreground="White" Text="!" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
        <!--<DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="true" >-->
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="IsEnabled" Value="True" />
            <!--<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).Currentitem.ErrorContent}"/>-->
            <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="cycleErrStyle" TargetType="{x:Type TextBlock}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="true" >
            <Setter Property="Background" Value="Red" />
            <Setter Property="Foreground" Value="White" />
        </DataTrigger>
    </Style.Triggers>
</Style>
我的验证类:

public class CycleValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value,
        System.Globalization.CultureInfo cultureInfo)
    {
        BindingGroup group = (BindingGroup)value;
        StringBuilder error = null;
        foreach (var item in group.Items)
        {
            IDataErrorInfo info = item as IDataErrorInfo;
            if (info != null)
            {
                if (!string.IsNullOrEmpty(info.Error))
                {
                    if (error == null)
                    {
                        error = new StringBuilder();
                    }
                    error.Append((error.Length != 0 ? ", " : "") + info.Error);
                }
            }
        }

        if (error != null)
            return new ValidationResult(false, error.ToString());
        else
            return new ValidationResult(true, "");

    }
}
验证后,我希望故障单元格亮起,当悬停故障单元格时,工具提示中将仅显示该特定单元格/字段的验证错误的错误消息

更新2019-01-17:


必须有一种方法将
IDataErrorInfo
ValidationRules
相结合,这样来自
IDataErrorInfo
的错误消息才能进入
ValidationRule
(目前运行良好)我可以将错误消息与
ValidationRule
中的错误消息组合起来,并向GUI(WPF)提出此错误消息总和。。。但工具提示中仅显示来自
IDataErrorInfo
的错误消息。

IDataErrorInfo
不支持每个属性的多个验证错误。在.NET Framework 4.5中引入的较新接口不支持

这里有一个如何实现它的示例


您可以使用
ItemsControl
显示错误消息。请参阅我的答案以获取示例。

错误在RawTag类中设置。尝试在循环单元格中插入字符串。
public class CycleValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value,
        System.Globalization.CultureInfo cultureInfo)
    {
        BindingGroup group = (BindingGroup)value;
        StringBuilder error = null;
        foreach (var item in group.Items)
        {
            IDataErrorInfo info = item as IDataErrorInfo;
            if (info != null)
            {
                if (!string.IsNullOrEmpty(info.Error))
                {
                    if (error == null)
                    {
                        error = new StringBuilder();
                    }
                    error.Append((error.Length != 0 ? ", " : "") + info.Error);
                }
            }
        }

        if (error != null)
            return new ValidationResult(false, error.ToString());
        else
            return new ValidationResult(true, "");

    }
}