bmt*_*033 3 c# data-binding wpf
我有一个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
}
Run Code Online (Sandbox Code Playgroud)
我还有几个验证规则,用于验证这些控件中的用户输入.如果有任何验证错误,我正在使用命令绑定来阻止我的用户保存数据.我的应用程序还包括一个"重置默认值"按钮,显然,它将重置业务对象上所有属性的默认值.除了一个例外,这一切都完全符合我的要求.如果我的用户将无效数据输入一个或多个控件,然后单击"重置默认值"按钮,则包含无效数据的控件并不总是按照我的预期更新.这是因为我的属性设置器中的以下代码:
if (_name == value)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
存在此代码是为了防止在我的用户在绑定的UI控件中输入的值与属性已设置的值相同时发生不必要的属性更改通知.举个例子,我的UI中有一个IntegerUpDown控件(这个控件是Xceed的Extended WPF Toolkit的一部分).我的控件绑定的属性的默认值是10.我的用户从控件中删除了值,并且触发了我的验证规则,这导致验证错误,并且使用错误装饰器等适当地更新UI.此控件映射到的属性尚未更改,因此它仍设置为10.现在我的用户单击"重置默认值"按钮,这将导致重置属性的默认值(10).但是,属性的值已设置为10,因此我的setter中的短路逻辑将返回而不是设置属性值.
所以现在,在我的用户点击"重置默认值"后,我也强制更新我的绑定目标,如下所示:
this.myIntegerUpDown.GetBindingExpression(Xceed.Wpf.Toolkit.IntegerUpDown.ValueProperty).UpdateTarget();
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题,但仅限于此特定控件.是否有任何简单的方法可以为我的所有绑定控件执行此操作而无需指定每个控件?谢谢.
您可以执行以下操作之一吗?
1) 重置DataContext- 重新创建它,或重新设置属性
var context = this.DataContext;
this.DataContext = null;
this.DataContext = context;
Run Code Online (Sandbox Code Playgroud)
2) 通过反射以编程方式循环遍历所有属性,并OnPropertyChanged使用相关属性名称手动调用。
var properties = typeof(ViewModel).GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var property in properties)
{
this.OnPropertyChanged(new PropertyChangedEventArgs(property.Name));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9795 次 |
| 最近记录: |