2011-02-03 75 views
3

很簡單,我如何使綁定更具響應性。也就是說,將界面更改爲更接近於在後臺更改視圖模型的時間。WPF中的實時綁定

我有一個令人難以置信的跳動的基於計時器的進度條。而且我有一個觸摸屏鍵盤,可以在按鍵後更新字段,比如數小時(誇張)。

+0

這不正是你所要求的,但WPF具有類似PriorityBinding這樣就可以顯示不同的值時,緩慢的綁定在後臺加載。還有DispatchPriority,因此您可以決定UI如何從調度程序接收項目。 – baalazamon 2011-02-03 16:01:27

回答

2

問題是分派器的隊列優先級(請參見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

4

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