2011-01-13 40 views
4

的再验证我有绑定到属性MinCartValue和MaxCartValue两个对照。 MinCartValue必须小于MaxCartValue。为了实现这种验证,我已经实现了IDataErrorInfo接口,并且如果触及了MinCartValue或MaxCartValue,则在此[columnName]方法中运行上述检查。 ValidatesOnDataErrors = True在两个控件的绑定中设置。 验证工作正常,当对其属性值的更改违反规则时突出显示每个控件。问题是,一旦控件被标记为无效,如果用户通过更改其他控件的值来纠正问题,则第一个控件将保持标记为无效。这是可以理解的,因为IDataErrorInfo方法没有对第一个控件的属性进行验证。S/L 4&IDataErrorInfo的 - 如何强制控制(当相关的控制被触摸)

所以我需要的是一种强制性质#1被重新验证(或方法来清除无效的状态)时,性能#2被验证,反之亦然。我曾尝试在我的[columnName]方法中调用RaisePropertyChanged,但它什么都不做。也尝试将属性设置为自己的值来试图欺骗它来验证自己,但是再次没有任何反应。

感谢

回答

2

我会建议看INotifyDataErrorInfo接口(在Silverlight 4中引入)。如果属性变得无效,它可以异步通知,所以我认为框架更好地尊重许多属性,而不是期望当前正在更改的属性是唯一一个有效性可能发生变化的属性。

+0

好的,我会看看这个。 – Laurence 2011-01-15 15:18:43

+0

为什么哦为什么`INotifyDataErrorInfo`不在WPF中?这样一个有用的界面! – 2011-02-18 12:19:38

0

我不知道如果我恰好认识你的问题,但也许这可能会有帮助。提供一些示例XAML和绑定属性代码会有所帮助。

这听起来像取决于默认UpdateSourceTrigger,这在TextBox控件的情况下,是他们的重点/无焦点的你的代码的问题。您可以在XAML中设置UpdateSourceTrigger属性,方法是将UpdateSourceTrigger = Explicit添加到发生验证的绑定中。然后在每个TextBox(MinCartValue,MaxCartValue)中,向TextChanged事件添加一个事件处理程序。

在事件处理程序的代码隐藏,你可以做这样的事情:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     TheTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 

TheTextBox在这种情况下将是你的车的控件之一。 UpdateSource()方法是一种手动更新绑定值的方法,该方法会触发您的验证。此方法提供了绑定到触发器以更新值并且引发属性在默认范围之外更改的情况(在此实例中使用文本更改的焦点集中和未着重于TextBox)。

+0

谢谢。我应该提到我使用MVVM方法,其中“后面的代码”没有对XAML控件的引用。我想坚持这一点,所以我只想通过引用充当数据上下文的对象的属性来寻找一种方法。 – Laurence 2011-01-15 15:18:26

+0

是的,我不知道你是否使用MVVM。我尝试自己关注MVVM,但是我不幸想出了一个很好的解决这个问题的MVVM解决方案。 – avanek 2011-01-17 14:16:13

0

这里是我如何解决它。假设Property1和Property2是相关的。我对MVVM还不熟悉,但是您可能会扩展您的实体类以实现IDataErrorInfo。在这种情况下,你也可以延长在相互依存的性质[属性]更改方法和报告变化:

partial class YourEntity : IDataErrorInfo 
{ 
    public string this[string columnName] 
     { 
      //Your validation logic 
     } 

    public string Error 
    { 
     //WPF doesn't use it anyway 
     get { return string.Empty; } 
    } 

    partial void OnProperty1Changed() 
    { 
     OnPropertyChanging("Property2"); 
     OnPropertyChanged("Property2"); 
    } 

    partial void OnProperty2Changed() 
    { 
     OnPropertyChanging("Property1"); 
     OnPropertyChanged("Property1"); 
    } 
} 

在这种情况下,更新的这两种属性之一,使重新评估自己都绑定控件。

EDIT2:看来你应该使用OnPropertyChang *而不是ReportPropertyChang *。 ReportPropertyChanged会通知实体框架模型中有未决的变化,但实际上你所要做的只是通知视图。你不想用没有真正改变的属性来更新数据库。 ReportPropertyChang *也将在数据库中没有映射的计算字段上失败。编辑1:发现在ReportPropertyChanged之前调用ReportPropertyChanging是必不可少的。

1

我有两个需要互相验证的DateTime属性(DateFrom和DateTo)。在这些属性的setter中,我只是为DateTo和DateFrom引发了一个PropertyChanged事件。像魅力一样工作。