很简单,我怎样才能使绑定更具响应性。也就是说,将界面更改为更接近于在后台更改视图模型时。
我有一个基于计时器的进度条,令人难以置信的跳跃。而且我有一个触摸屏键盘,可以比按键更快地更新字段(夸张)。
答案 0 :(得分:4)
好的,在提供UI响应时,您可以使用三个选项:
(1)。使用异步绑定:
<TextBlock Text="{Binding ViewModelTextProperty, IsAsync=True}"/>
这样,ViewModelTextProperty
的值将异步检索。
(2)。使用PriorityBinding
- 它与前一个选项类似,但它还允许您在异步执行主绑定时显示某些内容:
<TextBlock>
<TextBlock.Text>
<PriorityBinding>
<Binding Path="ViewModelTextProperty" IsAsync="True"/>
<Binding Path="FastViewModelTextProperty" IsAsync="True"/>
</PriorityBinding>
</TextBlock.Text>
</TextBlock>
在顶部指定慢速绑定,在底部指定快速绑定。也就是说,在此示例中,将首先显示FastViewModelTextProperty
的值,当ViewModelTextProperty
的值准备就绪时,将显示该值。
(3)。最后,您可以在视图模型中使用通常的异步编程(异步调用方法,使用计时器等)。只要您准备好显示某些数据,请使用Dispatcher:
更新UI(设置绑定属性的值)private void OnAsyncOperationCompleted()
{
Application.Current.Dispatcher.BeginInvoke(new Action(() => {
// Update the UI
}));
}
答案 1 :(得分:2)
问题是Dispatcher的队列优先级(参见this)。即使您对ViewModel中的更改做出更快的响应(例如通过手动更新控件),渲染本身也会以较低的优先级完成。因此,我想它不会给你任何明显的差异,因为用户在下一次渲染后不会看到它。“
编辑: 通常,WPF中的UI(即使在进行数据绑定时)也非常敏感。但是,有一些原因导致它变慢(使用WPF performance toolkit查看应用程序):