c# - 强制所有 WPF 绑定(bind)控件使用 GetBindingExpression().UpdateTarget() 进行更新

标签 c# wpf data-binding

我有一个 WPF 应用程序,其中包含约 50 个控件,这些控件绑定(bind)到实现 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
}

我还有几个验证规则,用于验证这些控件中的用户输入。我正在使用命令绑定(bind)来防止我的用户在出现任何验证错误时保存数据。我的应用程序还包含一个“重置默认值”按钮,显然,该按钮将重置我的业务对象上所有属性的默认值。除了一个异常(exception),这一切都完全按照我的意愿工作。如果我的用户在一个或多个控件中输入无效数据,然后单击“重置默认值”按钮,则包含无效数据的控件并不总是像我期望的那样更新。发生这种情况是因为我的属性 setter 中有以下代码:

if (_name == value)
{
    return;
}

此代码的存在是为了防止当我的用户在绑定(bind)的 UI 控件中输入的值与属性已设置的值相同时发生不必要的属性更改通知。例如,我的 UI 中有一个 IntegerUpDown 控件(此控件是 Xceed 的扩展 WPF 工具包的一部分)。我的控件绑定(bind)到的属性的默认值为 10。我的用户从控件中删除了该值,并且触发了我的验证规则,这导致验证错误,并且 UI 使用错误装饰器等进行了适当更新。该值此控件映射到的属性的值尚未更改,因此仍设置为 10。现在我的用户单击“重置默认值”按钮,这将导致属性的默认值 (10) 被重置。但是,该属性的值已经设置为 10,因此我的 setter 中的短路逻辑将返回而不是设置属性值。

所以现在,在我的用户点击“重置默认值”后,我也强制更新我的绑定(bind)目标,如下所示:

this.myIntegerUpDown.GetBindingExpression(Xceed.Wpf.Toolkit.IntegerUpDown.ValueProperty).UpdateTarget();

这解决了我的问题,但仅针对此特定控件。有什么简单的方法可以为我的所有 绑定(bind)控件执行此操作而不必指定每个控件吗?谢谢。

最佳答案

OnPropertyChanged(new PropertyChangedEventArgs(string.Empty));

这意在暗示该对象的所有属性都已更改。

关于c# - 强制所有 WPF 绑定(bind)控件使用 GetBindingExpression().UpdateTarget() 进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094019/

相关文章:

wpf - 在WPF中,如何在DataGrid上显示AdornerLayer

android - 当 edittext 的默认文本为浮点值时,编辑文本光标重置为左侧

c# - 使用 Lambda 获取不同的父项

c# - 不变名称为 'MySql.Data.MySqlClient' 的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册

wpf - 开口WPF用户控件的winform窗口缩小父的winform窗口

c# - 在 MVVM 中,如何防止 BackgroundWorker 卡住 UI?

wpf - MC3074 - "clr-namespace..."中不存在类型

c# - ssl wcf 使证书在另一台计算机上可用

c# - 我可以将对象分配给实体对象吗?

c# - 是否有可能在 WPF 用户控件中启动 Xamarin.Forms 应用程序?