C# 当引发PropertyChanged时,WinForms会重新查询数据源的每个属性

C# 当引发PropertyChanged时,WinForms会重新查询数据源的每个属性,c#,winforms,inotifypropertychanged,bindingsource,2-way-object-databinding,C#,Winforms,Inotifypropertychanged,Bindingsource,2 Way Object Databinding,我正在开发一个WinForms应用程序,目前我正在使用BindingSource为我的复杂对象提供干净、GUI管理的数据绑定。对于本问题,可以忽略此ViewModel对象上的项目列表,我们可以关注这样一个事实,即我至少有50个绑定的属性 我在一个属性的get访问器上放置了一个断点,发现每当我更新引发PropertyChanged事件的属性时,它都会被命中。根据我的研究,这似乎是因为CurrencyManager正在刷新整个当前“行”以便显示,因为一个属性发生了更改。(我可能错了。)我创造了一个解

我正在开发一个WinForms应用程序,目前我正在使用BindingSource为我的复杂对象提供干净、GUI管理的数据绑定。对于本问题,可以忽略此ViewModel对象上的项目列表,我们可以关注这样一个事实,即我至少有50个绑定的属性

我在一个属性的get访问器上放置了一个断点,发现每当我更新引发PropertyChanged事件的属性时,它都会被命中。根据我的研究,这似乎是因为CurrencyManager正在刷新整个当前“行”以便显示,因为一个属性发生了更改。(我可能错了。)我创造了一个解决方案,但我很想知道是否有其他人遇到过这个问题,也许可以告诉我一个更干净的解决方案。见下文:

    public void StartProgress()
    {
        Enabled = false;
        pbBusyIndicator.Visible = true;
        btnClearForm.Enabled = false;
        btnSaveCarrier.Enabled = false;
        carrierViewModelBindingSource.RaiseListChangedEvents = false;
        carrierViewModelBindingSource.SuspendBinding();
    }

    public void StopProgress()
    {
        Enabled = true;
        pbBusyIndicator.Visible = false;
        btnClearForm.Enabled = true;
        carrierViewModelBindingSource.ResumeBinding();
        carrierViewModelBindingSource.CurrencyManager.Refresh();
        carrierViewModelBindingSource.RaiseListChangedEvents = true;
    }
如上所述,数据源绑定到单个对象。我必须再次将RaiseListChangedEvents设置为true,因为关闭时双向数据绑定不起作用:(


提前感谢您的帮助!

您是否因此遇到性能问题,或者只是过早优化?在GUI中显示新值的响应时间不好。我希望它是干净、平滑的刷新。是否所有单元格都需要可编辑?如果不在数据绑定中,您可以将模式指定为一次性。我不是t使用单元格。这会绑定到文本框和下拉框等。双向绑定您是否尝试过不使用BindingSource,并在代码中手动定义每个绑定?这肯定会消除多余的读取。