2014-01-05 51 views
10

我在ViewModel中進行了數據驗證。當我加載View,有效性驗證不改變TextBox的內容檢查,通過加載錯誤樣式設置爲TextBox如何停止驗證觸發器在wpf中自動啓動

這裏的觀點意思是代碼:

XAML

<TextBox {...} Text="{Binding Path=ProductName, 
       UpdateSourceTrigger=PropertyChanged, 
       ValidatesOnDataErrors=True}"/> 

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驗證有這個問題,直到我知道什麼都不能做Directly.IDataErrorInfo/INotifyDataErrorInfo是更好的選擇,因爲我們從setter中設置它們,並且這個問題不存在,再加上我們可以通過ourelve處理所有事情。 – ethicallogics

回答

2

無論何時PropertyChanged事件發生財產,驗證都會被檢查。

我懷疑從構造函數你設置屬性。在負載情況下,考慮設置你的財產的領域而不是實際的財產。

_productName = "TestName"; 
2

即使我有同樣的問題。通過使用一個簡單的技巧來修復它。我定義了一個私人布爾

private bool _firstLoad; 

在我設定的_firstLoad到真正的構造函數。在數據驗證期間,如果_firstLoad爲真,我將返回String.Empty。雖然設置你的PropertyProductName

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

我設置_firstLoad爲false。所以現在當驗證由PropertyChanged事件觸發時,驗證將按預期工作。