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