【问题标题】:Validation.HasError not firing for a DataGrid validating against IDataErrorInfoValidation.HasError 未触发针对 IDataErrorInfo 验证的 DataGrid
【发布时间】:2012-08-21 17:18:13
【问题描述】:

我有一个使用内联样式的 DataGrid,它添加了用于报告错误消息的工具提示 - 我将它绑定到实现 IDataErrorInfo 的集合。

特别是,我有一个绑定到具有 IDataErrorInfo 逻辑的整数的列,以不允许超出特定范围的值 - 当我违反此规则时,将应用默认错误行为(例如,文本框以红色突出显示)而不是激活我的错误样式,但是如果我通过在文本框中输入文本并导致 InvalidInputString 格式触发错误,它将触发我的错误样式,就像我想要的那样。

这是我的 XAML:

<DataGrid ItemsSource="{x:Static local:WeatherForecast.TomorrowsForecast}" AutoGenerateColumns="False">
        <DataGrid.Resources>
            <Style x:Key="errorStyle" TargetType="{x:Type TextBox}">
                <Setter Property="Padding" Value="-2"/>
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="True">
                        <Setter Property="Background" Value="PeachPuff"/>
                        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.Resources>

        <DataGrid.Columns>
            <DataGridTextColumn Header="City" Binding="{Binding Path=Planet}"/>
            <DataGridTextColumn Header="Low Temperature" Binding="{Binding Path=LowestTemp, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" EditingElementStyle="{StaticResource errorStyle}" />
            <DataGridTextColumn Header="High Temperature" Binding="{Binding Path=HighestTemp, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" EditingElementStyle="{StaticResource errorStyle}" />
        </DataGrid.Columns>
    </DataGrid>

我的简单 IDateErrorInfo 逻辑是:

    public string this[string columnName]
    {
        get 
        {
            // Temperature range checks.
            if ((columnName == "LowestTemp") || (columnName == "HighestTemp"))
            {
                if ((this.LowestTemp < -273) || (this.HighestTemp < -273))
                {
                    return "Temperature can not be below the absolute cold (-273°C).";
                }
            }

            // All validations passed successfully.
            return null;

        }
    }

为什么触发红色边框的默认错误验证行为,而不是我的风格?

更新:

在 DataGrid 外部完成时,这似乎可以正常工作,例如,如果我有两个杂散的文本框绑定到我的对象的一个​​实例

<TextBlock>Lowest Temp</TextBlock>
    <TextBox Width="100" DataContext="{StaticResource instance}" Text="{Binding Path=LowestTemp, NotifyOnValidationError=True, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" Style="{StaticResource errorStyle}" />
    <TextBlock>Highest Temp</TextBlock>
    <TextBox Width="100" DataContext="{StaticResource instance}" Text="{Binding Path=HighestTemp, NotifyOnValidationError=True, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" Style="{StaticResource errorStyle}" />

效果很好!知道 DataGrid 的内部结构可能会阻止这种行为吗?

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    您的DataGridTextColumn 上缺少NotifyOnValidationError=True

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2013-07-29
      相关资源
      最近更新 更多