考虑以下 ViewModel 属性:
private string _slowProperty;
public string SlowProperty
{
get { return _slowProperty; }
set
{
_slowProperty = value;
RaisePropertyChanged("SlowProperty");
}
}
绑定(bind)到文本框,如下所示:
<TextBox Text="{Binding SlowProperty}" />
现在,这里的问题是每次 SlowProperty 的值发生变化时,而且它经常发生变化,文本框会去尝试获取它的值,这非常慢。我可以使用异步绑定(bind)来缓解这种情况,但是,这仍然会浪费 CPU 周期。
相反,我想要的是:
<TextBlock Text="{z:DelayedSourceBinding SlowProperty}" />
它会在一定的延迟后尝试获取绑定(bind)。因此,例如,如果 SlowProperty
在短时间内连续更改 5 次,则只有最后一个文本在文本框中可见。
我找到了 following project执行类似的操作,所以它是我的示例,我可以这样使用它:
<TextBox Text="{z:DelayBinding Path=SearchText}" />
它的问题是,它只会在延迟后更新绑定(bind) target。但是,会评估源路径,并在每次更改源时执行其 getter。在 SlowProperty
的情况下,这仍然会浪费 CPU 周期。
我尝试制作自己的延迟绑定(bind)类,但是 got stuck .有没有其他 Binder 可以做类似的事情?
为了完整起见,这里有 2 个执行类似任务的其他项目,但没有一个解决我遇到的问题:
DeferredBinding - 与 DelayBinding 类似的解决方案。但是,使用起来有点复杂。
DelayedBindingTextBox - 使用自定义文本框控件实现延迟绑定(bind)。
谢谢!
最佳答案
为什么不在 View 模型中解决这个问题呢?如果您的属性变化很快,但获取速度很慢,则您的 View 模型可能会暴露第二个“延迟”属性。您可以使用计时器定期更新此“延迟”属性。
或者,更简洁的实现可以使用 Throttle响应式(Reactive)扩展框架提供的功能。
关于c# - 来自源的延迟绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8682743/