我有一个WPF应用程序,其中包含约50个控件,这些控件绑定到实现了INotifyPropertyChanged接口的业务对象上的属性。以下是我的业务对象的简要代码片段:
public class MyBusinessObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
// properties begin here
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value)
{
return;
}
_name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
// constructor, etc. not shown
}
我还有几条验证规则用于验证这些控件中的用户输入。我使用命令绑定来防止用户在存在任何验证错误时保存数据。我的应用程序还包括一个“重置默认值”按钮,显然,它将重置业务对象上所有属性的默认值。除一种情况外,所有操作都正常工作。如果用户向一个或多个控件输入无效数据,然后单击“重置默认值”按钮,则包含无效数据的控件不会总是按照我的预期更新。这是由于我的属性设置器中以下代码引起的:
if (_name == value)
{
return;
}
这段代码的作用是防止当用户在绑定的UI控件中输入的值与属性已经设置的相同时发生不必要的属性更改通知。例如,我在我的UI中有一个IntegerUpDown控件(这个控件是来自Xceed的Extended WPF Toolkit),我的控件绑定的属性的默认值是10。我的用户从控件中删除该值,我的验证规则被触发,导致验证错误,并适当地更新UI,包括错误装饰器等。这个控件映射到的属性的值还没有改变,所以它仍然设置为10。现在,我的用户点击“重置默认值”按钮,这将导致属性的默认值(10)被重置。然而,属性的值已经设置为10,因此我的setter中的短路逻辑将返回而不是设置属性值。
因此,现在,在我的用户点击“重置默认值”之后,我也强制更新我的绑定目标,如下所示:
this.myIntegerUpDown.GetBindingExpression(Xceed.Wpf.Toolkit.IntegerUpDown.ValueProperty).UpdateTarget();
这解决了我的问题,但只适用于特定控件。有没有简单的方法可以对我绑定的所有控件都这样做,而不必指定每个控件呢?谢谢。