検証メッセージが変更されたときに、WPF データ グリッドと検証エラー ツールチップが更新されないという厄介な問題があります。これは .Net 4 コードを使用しているため、INotifyDataErrorInfoを使用できません。
データグリッドにバインドされたObservableCollection があります。コレクションのオブジェクト型はIDataErrorInfoを実装しているため、検証をサポートし、無効な値を持つフィールドを強調表示できます。ほとんどの場合、これで問題なく動作します。ただし、次のシナリオでは、ツールヒントに表示されるメッセージに問題があります。
- フィールド A には、ルール 1 とルール S (共有ルール) の 2 つのルールがあります。
- フィールド B にはルール S (共有ルール) が 1 つあります。
- ルール S は、フィールド A とフィールド B の両方を参照するよりも共有ルールです
ルール 1 とルール S の両方が無効である場合、各フィールドに次の検証ツールチップが表示されます。これが望ましい動作です。
Field A < "Rule 1 is invalid. Rule S is invalid" Field B < "Rule S is invalid"
フィールド B を編集してルール S を有効にするとします。両方のツールチップ メッセージを次のように更新します。
Field A < "Rule 1 is invalid." Field B < (valid - no tooltip)
フィールド A の検証状態は変更されておらず (Validation.HasError の値は変更されていません)、ツールヒントにバインドされたメッセージのみが変更されていることに注意してください。
実際に目にするのは次のとおりです。
Field A < "Rule 1 is invalid. Rule S is invalid"
Field B < (valid - no tooltip)
この時点で、クラス インスタンスの基礎となる ValidationError データは正しいことに注意してください。
状態を強制的に再クエリして IDataErrorInfo.this[string columnName] を再度呼び出さない限り、UI はフィールド A のツールヒント テキストを更新しないようです。これを強制的に発生させる唯一の方法は、フィールド A のプロパティ変更イベントを手動で発生させることです。エラーメッセージ。このソリューションは機能しますが、余分で不要なプロパティ変更イベントは、大量のデータでパフォーマンスを台無しにします。
プロパティ変更イベントを発生させることなく、フィールド B に対して IDataErrorInfo.this[string columnName] を強制的に呼び出すにはどうすればよいですか?
注: 検証メッセージを表示するために使用するエラー データ テンプレートは次のとおりです。
<!-- ERROR HANDLING Data Template -->
<Style x:Key="controlBaseStyle"
TargetType="{x:Type Control}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="Red"
BorderThickness="2"
Visibility="{Binding ElementName=placeholder, Path=AdornedElement.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
<AdornedElementPlaceholder x:Name="placeholder"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ToolTipService.ShowOnDisabled" Value="true"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem, Converter={StaticResource ErrorContentConverter}}"/>
</Trigger>
<!--We don't want to see the validation if the control is disabled. This doesn't affect it if the control is read only. -->
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<AdornedElementPlaceholder x:Name="placeholder"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>