延迟属性更新,直到一堆属性已经改变(例如.锁定控件)
本文关键字:属性 例如 控件 锁定 一堆 改变 更新 延迟 | 更新日期: 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样式结合使用