3

私は MVVM を使用し、私のオブジェクトは IDataErrorInfo を実装しています。プロパティが設定されると、カスタム検証メソッドを実行し、検証に合格すると、Validation.HasError を false に設定する String.empty を返します。検証が失敗した場合、Validation.HasError は true に設定されます。「必要なコントロール」(検証を実行するコントロール)に使用するスタイルがあり、コントロールのツールチップを次のようなエラーに設定します。

<Style x:Key="RequiredControl" TargetType="{x:Type Control}" >
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding (Validation.Errors), Converter={StaticResource ErrorConverter}, RelativeSource={x:Static RelativeSource.Self}}"/>
        </Trigger>
    </Style.Triggers>
</Style>

そして ErrorConverter:

public class ZynErrorContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var errors = value as ReadOnlyObservableCollection<ValidationError>;
        if (errors == null) return "";

        return errors.Count > 0 ? errors[0].ErrorContent : "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

問題は次のとおりです。ユーザーが無効なものを入力すると、Validation.HasError が true に設定されます。ツールチップは想定どおりに更新されます。ユーザーがエラーを修正しようとして、別の種類の無効化を引き起こす値を入力した場合、ツールチップには新しいエラー文字列が表示されるはずですが、これは起こりません。エラーは、最初のエラーと同じエラーとして表示されます。なぜこれが起こるのか私は知っています(私は思う)... Validation.HasError が True -> False -> True から決して変化しないため、トリガーがトリガーされないためです。

トリガーを強制する方法について、これに関する経験やアドバイスはありますか?

4

3 に答える 3

3

これが答えのようです:プロパティの複数のエラー メッセージを含む IDataErrorInfo

基本的に、現在のアイテムにバインドし、ContentPresenter を使用してエラーを表示します。それは私のコードでうまくいきました。

于 2011-04-01T13:56:52.477 に答える