4

私の現在のプロジェクトでは、WPF フォームでデータ検証を処理する必要があります。私のフォームは ResourceDictionnary の DataTemplate にあります。(2 つのDelegateCommandを介して) データをシリアル化および逆シリアル化する 2 つのボタンのおかげで、フォームからデータを保存およびロードできます。

フォームの 1 つのフィールドが空または無効な場合、保存ボタンが無効になります。UpdateSourceTrigger プロパティにより、変更されるたびにフィールドがチェックされます。そのため、保存コマンドを更新するためにフィールドが無効かどうかを C# コードで知る必要があります。

現在、XAML Binding で ExceptionValidationRule を使用していますが、これが適切な方法であるかどうか疑問に思っています。保存コマンドを更新する (保存ボタンを有効または無効にする) ために、フィールドが無効かどうかを C# コードで知る必要があるため、ValidationRule を実装できません。

<TextBox>
    <Binding Path="Contact.FirstName" UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <ExceptionValidationRule/>
        </Binding.ValidationRules>
    </Binding>
</TextBox>

このブログでは、次のことを読むことができます。

これらのプロパティはコードによっても設定され、一時的にエラー値を残しても問題ない場合があるため、Setter で例外を発生させることはあまり良い方法ではありません。

この投稿は既に読みましたが、使用できません。TextBox は DataTemplate にあり、C# コードでは使用できません。

したがって、データ検証を変更して、ExceptionValidationRule を使用しないようにする必要があるのではないかと考えています。

4

1 に答える 1

6

ありがとうございますあなたのアイデアは良かったです。IDataErrorInfo は ExceptionValidationException よりも優れているようで、機能します。

これが私のプロジェクトに一致する例です: IDataErrorInfo サンプル

DelegateCommand は使用しませんが、変更できるほど単純です。モデルは IDataErrorInfo を実装する必要があります。

public class Contact : IDataErrorInfo
{

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    public string Name { get; set; }

    public string this[string property]
    {
        get 
        {
            string result = null;
            if (property== "Name")
            {
                if (string.IsNullOrEmpty(Name) || Name.Length < 3)
                    result = "Please enter a Name";
            }
            return result;
        }
    }

}

XAML コードでは、Binding を変更することを忘れないでください。

<TextBox>
    <Binding Path="Contact.Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
</TextBox>
于 2013-03-04T14:01:57.987 に答える