我有一个使用内联样式的 DataGrid,它添加了一个用于报告错误消息的工具提示 - 我将它绑定(bind)到一个实现 IDataErrorInfo 的集合。
特别是,我有一个绑定(bind)到整数的列,该列具有 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 外部完成时似乎工作正常,例如,如果我有两个杂散文本框绑定(bind)到我的对象的一个实例
<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 内部结构是什么吗?
最佳答案
您的 DataGridTextColumn
上缺少 NotifyOnValidationError=True
关于c# - Validation.HasError 未针对针对 IDataErrorInfo 验证的 DataGrid 触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12059887/