WPF中的实时绑定
问题描述:
很简单,我如何使绑定更具响应性。也就是说,将界面更改为更接近于在后台更改视图模型的时间。WPF中的实时绑定
我有一个令人难以置信的跳动的基于计时器的进度条。而且我有一个触摸屏键盘,可以在按键后更新字段,比如数小时(夸张)。
答
问题是分派器的队列优先级(请参见this)。即使您对ViewModel的更改做出了更快的响应(例如,通过手动更新控件),渲染本身也会以较低的优先级完成。因此,我想它不会对你做出任何明显的区别,因为用户在下一次渲染后不会看到它。
编辑: 一般来说,即使在进行数据绑定时,WPF中的UI也非常灵敏。不过,也有一些原因,它可能会很慢(使用WPF performance toolkit看看应用程序):
- 具体的控制本身(这是很慢)可能是太复杂/臃肿。例如,我有一个控件,每次创建时都会加载一个400kb的样式文件。显然,这花了一些时间。在我的情况下,解决方案是一次加载父控件中的样式文件。
- 主线程(通常是您的UI线程)一次执行的处理过多。您可能会用一些长时间运行的计算阻塞该线程,这意味着它没有机会更新UI。所以这个计算应该在不同的线程(BackgroundWorker,ThreadPool线程,...)中完成。
- 整个用户界面可能太复杂。你可能有一个非常深刻的视觉/逻辑树或使用大风格/模板,有很多触发器或传统的位图效果的是,等
答
OK,有三个选择,当谈到使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>
慢绑定在顶部和快速的人在BUTTOM规定。也就是说,在本例中,首先显示的值为FastViewModelTextProperty
,当ViewModelTextProperty
的值准备就绪时,将显示该值。
(3)。最后,您可以在视图模型中使用通常的异步编程(异步调用方法,使用定时器等)。每当你准备显示一些数据,更新UI(绑定属性的设定值)使用Dispatcher:
private void OnAsyncOperationCompleted()
{
Application.Current.Dispatcher.BeginInvoke(new Action(() => {
// Update the UI
}));
}
这不正是你所要求的,但WPF具有类似PriorityBinding这样就可以显示不同的值时,缓慢的绑定在后台加载。还有DispatchPriority,因此您可以决定UI如何从调度程序接收项目。 – baalazamon 2011-02-03 16:01:27