3

IDataErrorInfo とマスター詳細ビューを実装する ViewModel があります。ユーザーが以前ではなく詳細ビューで保存ボタンを押したときに、現在の ViewModel アイテムの検証をトリガーするにはどうすればよいですか?

4

2 に答える 2

6

VM にフラグを含めることから始め、最初は false に設定します。ボタン コマンド コードで (ボタンを VM 上のコマンドにバインドしていると仮定します)、検証コードを実行する前にフラグをオンにします。

IDataErrorInfo プロパティの "get" コードでは、フラグが true に設定されている場合にのみ検証エラーを返し、それ以外の場合は空の文字列を返します。

フラグを false に戻す前に、プロパティ名として空の文字列を使用して PropertyChangedEvent を発生させます。これにより、バインディング システムは現在のコンテキストですべてのバインディングを再評価し、IDataErrorInfo に対してエラーをチェックします。

于 2011-03-06T13:02:39.600 に答える
6

benPearce が素晴らしい回答をくれました。

彼が指摘したように。

  1. this[columnName]「保存」をクリックするまで、(データが無効であっても) nullを返す必要があります。
  2. Saveコマンド内で、OnPropertyChanged(null)WPFがバインディングを再評価できるようにするために呼び出す必要があります(そしてインデクサーに問い合わせます)

フラグを使用する代わりに、このサンプルではディクショナリを使用して同じ結果を得ています。


ビュー

<TextBox Text="{Binding Surname, ValidatesOnDataErrors=True}" />

ビューモデル

public string Surname { get; set; }

#region Validation
//http://blogs.msdn.com/b/bethmassi/archive/2008/06/27/displaying-data-validation-messages-in-wpf.aspx
Dictionary<string, string> validationErrors = new Dictionary<string,string>();

void Validate()
{
    validationErrors.Clear();
    if (srtring.IsNullOrWhitespace(Surname)) // Validate Surname 
    {
        validationErrors.Add("Surname", "Surname is mandatory.");
    }

    //http://stackoverflow.com/a/5210633/240835
    // Call OnPropertyChanged(null) to refresh all bindings and have WPF check the this[string columnName] indexer.
    OnPropertyChanged(null);
}

#region IDataErrorInfo Members
public string Error
{
    get 
    {
        if (validationErrors.Count > 0)
        {
            return "Errors found.";
        }
        return null;
    }
}

public string this[string columnName]
{
    get 
    {                
        if (validationErrors.ContainsKey(columnName))
        {
            return validationErrors[columnName];
        }
        return null;
    }
}

#endregion
#endregion
public void Save()
{
    Validate();
    if (validationErrors.Count == 0)
    {
        DoSave();
    }
}
于 2013-12-20T22:50:56.433 に答える