1

こんな感じで、wpfバインディングをしています

<TextBox
        Name="txtRackNo"
        Grid.Column="5"
        Grid.ColumnSpan="7"
        Grid.Row="4"
        Grid.RowSpan="1"
        Style="{StaticResource ResourceKey=styleValidationTextBox}"
        Text="{Binding Path=rack_no, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}">
</TextBox>

IDataErrorInfo を実装し、viewmodel にプロパティを直接持つと、機能し、ツールチップと赤い検証ボックスが表示されます。
ビューモデルのプロパティであるクラスに IDataErrorInfo を実装すると、スタイルによってツールチップが作成されますが、赤いエラー ボックスは表示されません。私のスタイルが機能していると確信しています。この行を変更すると、

Text="{Binding Path=rack_no, Mode=TwoWay, ...}" 

私のデータ型「RACK」を使用するには

Text="{Binding Path=rack.rack_no, Mode=TwoWay, ...}"

private Rack _rack;
public Rack rack
{
    get { return _rack; }
    set
    {
        _rack = value;
        createPropertyObserver();
        base.RaisePropertyChanged("rack");
    }
}

次に、ツールチップのみが表示され、赤い検証エラー ボックスは表示されません。

編集:これはより多くのコードです。おそらくこれは誰かが私の質問をよりよく理解するのに役立ちますか?

class Rack : ObservableObject, IDataErrorInfo
{
    public String _rack_no;
    public String rack_no
{
         get { return _rack_no; }
    set
    {
    if (value != null)
    {
        _rack_no = value;
        base.RaisePropertyChanged("rack_no");
    }
    }
}

     public String Error
    {
        get { return this[null]; }
    }

    public String this[String propertyName]
    {
        get
        {
            String result = String.Empty;
            propertyName = propertyName ?? String.Empty;
            if (propertyName == String.Empty || propertyName == "dc_name")
            {
                if (String.IsNullOrEmpty(this.dc_name))
                {
                    result += "Datacenter name is mandatory." + Environment.NewLine;
                }
            }

            if (propertyName == String.Empty || propertyName == "rack_no")
            {
                if (String.IsNullOrEmpty(this.rack_no) || this.rack_no.Length > 5)
                {
                    result += "Rack number is mandatory and must be 5 letters or less."
                        + Environment.NewLine;
                }
            }
            Debug.WriteLine(result);
            return result.TrimEnd();
        }
    }

次に、ビューモデルの一部を次に示します。

              private Rack _rack;
    public Rack rack
    {
        get { return _rack; }
        set
        {
            _rack = value;
            createPropertyObserver();
            base.RaisePropertyChanged("rack");
        }
    }

私の見解では、テキスト ボックスを Rack.rack_no にバインドすると、検証エラーが発生すると、ツールチップが機能し、適切なエラー メッセージが表示されます。ただし、validationstyle を使用するようにテキスト ボックスを変更するわけではありません。

同じプロパティ (rack_no) を作成し、ビューモデルに idataerrorinfo を実装すると、代わりにこれにバインドされ、完全に機能します。

ここで何か間違ったことをしているかどうかを知りたいだけです。たとえば、これは検証の有効なバインディングではありませんか? Rack.rack_no クラスに引き続きバインドして検証を使用できるようにする方法はありますか?

4

1 に答える 1

0

このアイデアを破棄し、代わりに以下に示す方法を使用することにしました: http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundation および http://www.codeproject.com/Articles /97564/WPF-MVVM-Applicat での属性ベースの検証

これは System.ComponentModel.DataAnnotations と組み合わせて idataerrorinfo を使用します。検証を実行します。また、検証スタイルを変更して赤いボックスを手動で作成しました。これにより、子オブジェクトにバインドされているデータバインディングを検証する際にデフォルトの検証スタイルを使用する際の問題が修正されたようです。

于 2012-06-30T15:32:49.833 に答える