2014-01-05 11 views
10

ViewModelにデータ検証があります。wpfで検証トリガーを自動的に開始するのを停止する方法

XAML

<TextBox {...} Text="{Binding Path=ProductName, 
       UpdateSourceTrigger=PropertyChanged, 
       ValidatesOnDataErrors=True}"/> 
:私は Viewをロードすると、検証がエラースタイルが TextBoxここ

に設定されているビューをロードすることによって、意味、TextBoxの内容を変更せずにチェックされているコードです

ViewModelでは、データ注釈で検証が行われます。

Code

private string _productName; 

[Required(AllowEmptyStrings = false, ErrorMessage = "The Product Name can't be null or empty.")] 
[StringLength(50, ErrorMessage = "The Product Name can't be longer than 50.")] 
[Uniqueness(Entities.Product, ErrorMessage = "A Product with that Name already exists ")] 
public string ProductName 
{ 
    get { return _productName; } 
    set 
    { 
     _productName = value; 
     SaveProduct.OnCanExecuteChanged(); 
     OnPropertyChanged("ProductName"); 
    } 
} 

ビューの読み込み時に検証トリガーを停止するにはどうすればよいですか?

データが挿入されるまで、TextBoxにエラーを表示させたくありません。

+0

AttributeBasedバリデーションにはこの問題があり、何もできないとわかっています.IDataErrorInfo/INotifyDataErrorInfoはセッターから設定したもので、この問題はありません。また、ourselveですべてを処理できます。 – ethicallogics

答えて

2

PropertyChangedイベントが発生するたびに検証が行われます。

私はコンストラクタから疑いがありますあなたはプロパティを設定しています。代わりに、実際のプロパティではなく、プロパティのバックアップフィールドを設定することを検討してください。

_productName = "TestName"; 
2

でも同じ問題がありました。簡単なトリックを使って修正しました。私は私がtrueに_firstLoadを設定し、コンストラクタではプライベートブールに

private bool _firstLoad; 

を定義しました。データ検証中に_firstLoadが真の場合、私はString.Emptyを返します。あなたのPropertyProductName

public string ProductName 
    { 
    get { return _productName; } 
    set 
     { 
     _productName = value; 
     _firstLoad = false; 
     SaveProduct.OnCanExecuteChanged(); 
     OnPropertyChanged("ProductName"); 
     } 
} 

を設定している間、私はfalseに_firstLoadを設定します。したがって、今すぐ検証がPropertyChangedイベントによってトリガされると、検証は期待通りに機能します。

関連する問題