2014-01-05 124 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事件触发时,验证将按预期工作。