c# - 来自源的延迟绑定(bind)

标签 c# .net wpf data-binding

考虑以下 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/

相关文章:

c# - asp.net mvc 3 首先使用 EF 代码验证 Id 字段

c# - Windows Phone 8.1 中的警报通知

c# - 将方法作为参数传递 vs 直接调用方法

c# - 应用域问题

.net - 嵌入式脚本环境的优点/缺点?

.NET MVC4 DropDownList使用外键行为异常

c# - WIF 和子域

c# - 找不到类型或命名空间名称 'PrintDocument'(是否缺少 using 指令或程序集引用?)

c# - 画一个点

c# - WPF C# 绑定(bind)代码 - 为什么这个简单的示例不起作用?