エラー メッセージを報告するためのツールチップを追加するインライン スタイルを使用する 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;
}
}
私のスタイルではなく、赤い境界線のデフォルトのエラー検証動作はなぜですか?
アップデート:
これは、オブジェクトの 1 つのインスタンスにバインドされている 2 つの浮遊テキスト ボックスがある場合など、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 の内部構造について何か考えはありますか?