4

我有两个控件绑定到属性 MinCartValue 和 MaxCartValue。MinCartValue 必须小于 MaxCartValue。为了实现这个验证,我实现了 IDataErrorInfo 接口,如果 MinCartValue 或 MaxCartValue 被触及,则在 this[columnName] 方法中运行上述检查。ValidatesOnDataErrors=True 在两个控件的绑定中设置。验证正常工作,当对其属性值的更改违反规则时突出显示每个控件。问题是一旦一个控件被标记为无效,如果用户通过更改另一个控件的值来纠正问题,第一个控件仍然被标记为无效。这是可以理解的,因为 IDataErrorInfo 方法没有对第一个控件的属性进行验证。

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

谢谢

4

4 回答 4

2

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

于 2011-01-14T06:34:47.417 回答
1

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

于 2011-05-19T23:57:39.167 回答
0

这是我解决它的方法。假设 Property1 和 Property2 是相互依赖的。我还不熟悉 MVVM,但您可能正在扩展实体类以实现 IDataErrorInfo。在这种情况下,您还可以扩展 On[Property]Changed 方法并报告相关属性的更改:

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* 也将在数据库中没有映射的计算字段上失败。EDIT1:发现必须在 ReportPropertyChanged 之前调用 ReportPropertyChanging。

于 2011-03-21T20:04:16.873 回答
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 上的焦点)。

于 2011-01-14T20:35:56.200 回答