1

検証メッセージが変更されたときに、WPF データ グリッドと検証エラー ツールチップが更新されないという厄介な問題があります。これは .Net 4 コードを使用しているため、INotifyDataErrorInfoを使用できません。

データグリッドにバインドされたObservableCollection があります。コレクションのオブジェクト型はIDataErrorInfoを実装しているため、検証をサポートし、無効な値を持つフィールドを強調表示できます。ほとんどの場合、これで問題なく動作します。ただし、次のシナリオでは、ツールヒントに表示されるメッセージに問題があります。

  1. フィールド A には、ルール 1 とルール S (共有ルール) の 2 つのルールがあります。
  2. フィールド B にはルール S (共有ルール) が 1 つあります。
  3. ルール S は、フィールド A とフィールド B の両方を参照するよりも共有ルールです
  4. ルール 1 とルール S の両方が無効である場合、各フィールドに次の検証ツールチップが表示されます。これが望ましい動作です。

    Field A < "Rule 1 is invalid. Rule S is invalid"
    Field B < "Rule S is invalid"
    
  5. フィールド 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>
4

2 に答える 2

0

PropertyChanged各セッターで両方のプロパティを発生させるだけです。つまり、次のようになります。

  • andのセッターでPropertyChangedforを上げるAAB
  • andのセッターでPropertyChangedforを上げるBAB

それが私が知っている唯一の方法です。

于 2013-05-13T16:02:01.997 に答える