延迟属性更新,直到一堆属性已经改变(例如.锁定控件)

本文关键字:属性 例如 控件 锁定 一堆 改变 更新 延迟 | 更新日期: 2023-09-27 18:10:18

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

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

目标:只有当程序改变了所有的属性后,控件才需要更新。

我已经试过了:

  • 设置属性为惰性,只在被请求时更新。(不工作,WPF请求它);
  • 缓存计算结果。(不工作,因为总是有一个输入改变,使缓存无效);
  • 创建一个方法来一次设置多个属性。(不工作,一些属性是继承和来自另一个控件);
  • 在操作属性之前使控件折叠。(不工作,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());
}

看一下绑定的IsAsync属性。我想它可以与debounce样式结合使用