WPF中的实时绑定

问题描述:

很简单,我如何使绑定更具响应性。也就是说,将界面更改为更接近于在后台更改视图模型的时间。WPF中的实时绑定

我有一个令人难以置信的跳动的基于计时器的进度条。而且我有一个触摸屏键盘,可以在按键后更新字段,比如数小时(夸张)。

+0

这不正是你所要求的,但WPF具有类似PriorityBinding这样就可以显示不同的值时,缓慢的绑定在后台加载。还有DispatchPriority,因此您可以决定UI如何从调度程序接收项目。 – baalazamon 2011-02-03 16:01:27

问题是分派器的队列优先级(请参见this)。即使您对ViewModel的更改做出了更快的响应(例如,通过手动更新控件),渲染本身也会以较低的优先级完成。因此,我想它不会对你做出任何明显的区别,因为用户在下一次渲染后不会看到它。

编辑: 一般来说,即使在进行数据绑定时,WPF中的UI也非常灵敏。不过,也有一些原因,它可能会很慢(使用WPF performance toolkit看看应用程序):

  • 具体的控制本身(这是很慢)可能是太复杂/臃肿。例如,我有一个控件,每次创建时都会加载一个400kb的样式文件。显然,这花了一些时间。在我的情况下,解决方案是一次加载父控件中的样式文件。
  • 主线程(通常是您的UI线程)一次执行的处理过多。您可能会用一些长时间运行的计算阻塞该线程,这意味着它没有机会更新UI。所以这个计算应该在不同的线程(BackgroundWorker,ThreadPool线程,...)中完成。
  • 整个用户界面可能太复杂。你可能有一个非常深刻的视觉/逻辑树或使用大风格/模板,有很多触发器或传统的位图效果的是,等
+0

所以你的答案是没有答案? – Jordan 2011-02-03 16:29:54

+0

我有一个在动态w.r.t的页面上有近1000个绑定的项目。滑块控件,它非常灵敏。 – user7116 2011-02-03 17:01:37

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 
    })); 
}