2012-07-09 116 views
0

如果我將XAML元素綁定到數據源屬性,並且數據源變化更快,那麼人眼可以看到我假設UI也被重繪得更快,然後人眼可以看到並浪費資源。如果屬性發生變化,那麼將屬性更改提升爲一個標誌而不是觸發UI的重新繪製,然後觸發UI重繪的定時器會是一個好主意嗎?還是我錯過了UI如何重新繪製?XAML綁定UI更新

+0

它只是一個網格?或整個用戶界面? – 2012-07-09 06:49:50

+2

如果數據源正在觸發INotifyPropertyChanged事件,則網格將響應它們。你可以實現一個計時器來減少PropertyChanged的發生次數嗎?例如。在500毫秒後,如果財產發生變化並且事件未發起,則發起事件。 – Michael 2012-07-09 06:58:35

回答

0

使用提升屬性更改事件,也許這樣的delyed調用...

public static class DispatcherExtensions 
{ 
    private static Dictionary<string, DispatcherTimer> timers = 
     new Dictionary<string, DispatcherTimer>(); 
    private static readonly object syncRoot = new object(); 

    public static void DelayInvoke(this Dispatcher dispatcher, string namedInvocation, 
     Action action, TimeSpan delay, 
     DispatcherPriority priority = DispatcherPriority.Normal) 
    { 
     lock (syncRoot) 
     { 
      RemoveTimer(namedInvocation); 
      var timer = new DispatcherTimer(delay, priority, (s, e) => action(), dispatcher); 
      timer.Start(); 
      timers.Add(namedInvocation, timer); 
     } 
    } 


    public static void CancelNamedInvocation(this Dispatcher dispatcher, string namedInvocation) 
    { 
     lock (syncRoot) 
     { 
      RemoveTimer(namedInvocation); 
     } 
    } 

    private static void RemoveTimer(string namedInvocation) 
    { 
     if (!timers.ContainsKey(namedInvocation)) return; 
     timers[namedInvocation].Stop(); 
     timers.Remove(namedInvocation); 
    } 


} 

然後

private object _property; 
public object Property 
{ 
    get { return _property; } 
    set 
    { 
     if (_property != value) 
     { 
      _property = value; 
      Dispatcher.DelayInvoke("PropertyChanged_Property",(Action)(() => 
      { 
       RaisePropertyChanged("Property"); 
      }),TimeSpan.FromMilliseconds(500)); 

     } 
    } 
} 

不知道我喜歡它雖然...

-1

對於這種情況下的典型模式下,正在實施的屬性作爲

private object _property; 
    public object Property 
    { 
     get { return _property; } 
     set 
     { 
      if (_property != value) 
      { 
       _property = value; 
       RaisePropertyChanged("Property"); 
      } 
     } 
    } 

將更新您的結合僅當值改變

+2

我認爲尼克萊使用這種模式,但財產變化非常快。 – Batuu 2012-07-09 07:03:44

+1

如果他願意,對屬性的更改不會觸發對UI的更新,所以不應該對由UI更新導致的浪費的資源造成任何顧慮 – Dominik 2012-07-09 07:15:38

-1

在這種情況下的計時器觸發UI更新是通向走。爲了保持用戶界面的流暢度,需要約40ms的時間間隔。

public class ViewModel 
{ 
    private Timer updateTimer; 
    public ViewModel() 
    { 
     updateTimer = new Timer(); 
     updateTimer.Interval = 40; 
     updateTimer.Elapsed +=new ElapsedEventHandler(updateTimer_Elapsed); 
     updateTimer.Start(); 
    } 

    private object _property; 
    public object Property 
    { 
     get { return _property; } 
     set 
     { 
      if (_property != value) 
      { 
       _property = value; 
      } 
     } 
    } 

    void updateTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     RaisePropertyChanged(); 
    } 
} 

不帶參數調用RaisePropertyChanged()將強制UI刷新所有綁定。如果你不想要這個,你可以使用標誌或註冊表來標記哪些屬性需要更新。

+0

引入計時器會導致更多的傷害而不是幫助,該viewmodel類將會由於事件處理程序而生根。不要試圖處理認爲WPF可以爲你處理 – Dominik 2012-07-09 07:36:55

+0

我沒有看到這一點,這是比幫助更多的傷害。 WPF一如既往地處理用戶界面及其更新。我只想通過計時器來控制屬性更改的指示。 – Batuu 2012-07-09 07:56:38

+0

很傷心,因爲您添加了一個事件處理程序,您必須手動處理,一旦您希望ViewModel進行垃圾回收 – Dominik 2012-07-09 14:02:39