WPF中的实时绑定

时间:2011-02-03 15:58:23

标签: wpf binding real-time

很简单,我怎样才能使绑定更具响应性。也就是说,将界面更改为更接近于在后台更改视图模型时。

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

2 个答案:

答案 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查看应用程序):

  • 特定控件本身(速度太慢)可能过于复杂/臃肿。例如,我有一个控件,每次创建时都会加载一个400kb样式的文件。显然,这需要一些时间。在我的例子中,解决方案是将样式文件加载到父控件中一次。
  • 主线程(通常是您的UI线程)一次执行的处理过多。您可能会通过一些长时间运行的计算来阻止该线程,这意味着它没有机会更新UI。所以这个计算应该在不同的线程中完成(BackgroundWorker,ThreadPool线程......)。
  • 整个用户界面可能过于复杂。您可能拥有极深的视觉/逻辑树,或者使用具有大量触发器或传统位图效果的大型样式/模板等。