c# - 延迟属性更新,直到更改了一堆属性(即锁定控件)

标签 c# wpf dependency-properties

我做了一个控件,它有一个属性是通过使用一些其他属性作为输入来计算的。当这些输入属性中的任何一个发生变化时,都需要更新该属性。我已经通过为它们实现属性更改事件,将依赖属性标记为已更新,使这成为可能。更改 3 个属性意味着 3 个属性刷新。

我遇到的问题是,当这些属性中的一个以上发生变化时,每次这些属性中的任何一个发生变化时,依赖属性都会更新。然而,该属性需要一些时间来计算(和/或渲染)。当要更改多个属性时,我希望在更新所有属性后让它只更新一次。

目标:仅当程序完成更改所有属性时才需要更新控件。

我尝试过的:

  • 通过仅在请求时更新它来使属性惰性。 (不起作用,WPF 无论如何都会请求它);
  • 缓存计算结果。 (不起作用,因为总是有 1 个输入更改,使缓存无效);
  • 创建一个方法来一次设置多个属性。 (不起作用,一些属性是继承的,来自另一个控件);
  • 在操作属性之前使控件折叠。 (不起作用,WPF 仍会刷新属性)。

有没有人有更好的解决方案?

最佳答案

您可以推迟引发属性更改事件。或者创建一个将停止传播此事件的方法(即 StartUpdating)和另一个将触发所有事件的方法(即 EndUpdating)。

private bool _isUpdating;
private List<string> _properties = ...;

private void RaisePropertyChanged(string propertyName)
{
   if(_isUpdating) 
   {
     if(!_properties.Contains(propertyName)) _properties.Add(propertyName);
     return;
   } 

   PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

void StartUpdating() { _isUpdating = true; }

void EndUpdating()
{
  _isUpdating = false;
  foreach(var propertyName in _properties) RaisePropertyChanged(propertyName);
}

在你的方法中

void LongRunningMethodSync()
{
  try
  {
    StartUpdating(); 
    // do something synchronously
  }
  finally
  {
    EndUpdating();
  }
}

void LongRunningMethodAsync()
{
  StartUpdating(); 
  ExecuteMyAsyncTask(done => EndUpdating());
}

关于c# - 延迟属性更新,直到更改了一堆属性(即锁定控件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7644361/

相关文章:

c# - 从非托管 C++ 到 C# 的回调有效,但仅在调试器中有效

c# - 如何从 WPF 中通过 SaveFileDialog 保存 BitmapImage?

c# - 如何将属性绑定(bind)到另一个类的属性(没有 UI 控件)?

c# - 即时依赖属性

c++ - 项目依赖顺序 - VS2013

c# - 既然我们有了泛型,是否还需要 EventArg 类

c# - 如何从另一个类库引用的类库中自动复制嵌入资源?

c# - system.linq groupby 多个元素

wpf - Microsoft.Win32.OpenFileDialog.ShowDialog() 何时返回 null?

c# - 如何在不引用数据库的情况下在 WPF MVVM 应用程序中创建报告