2012-12-19 57 views
1

首先,感謝您抽出時間閱讀這篇文章。WPF - 如何通過綁定停止計時器

我有一個計時器類,每60秒從我的SQL數據庫中下載一次「產品」。即檢查可能已被其他用戶編輯的更新產品。

這裏是我的類代碼:

public class GetProducts : INotifyPropertyChanged 
    { 
     public GetProducts() 
     { 
      Timer updateProducts = new Timer(); 
      updateProducts.Interval = 60000; // 60 second updates 
      updateProducts.Elapsed += timer_Elapsed; 
      updateProducts.Start(); 
     } 

     public ObservableCollection<Products> EnabledProducts 
     { 
      get 
      { 
       return ProductsDB.GetEnabledProducts(); 
      } 
     } 

     void timer_Elapsed(object sender, ElapsedEventArgs e) 
     { 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("EnabledProducts")); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

    } 

我然後綁定到該到我的XAML(WPF)控制的標籤屬性:

<Page.Resources> 
    <!-- Products Timer --> 
    <products_timer:GetProducts x:Key="getProducts_timer" /> 
</Page.Resources> 


Tag="{Binding Source={StaticResource getProducts_timer}, Path=EnabledProducts, Mode=OneWay}" 

這個作品真的很好。我遇到的問題是,當控件託管的窗口或頁面關閉時,無論發生什麼,計時器都會繼續消失。

任何人都可以提出一種方法來停止頁面/控制不再可用時停止股票?

再次感謝您的時間。所有的幫助非常感謝。

+5

如何簡單地有一個OnClosing事件和CAL ling updateProducts.Stop()? – eandersson

回答

6

首先開始通過保持一個參考定時器:

private Timer updateProducts; 
public GetProducts() 
{ 
    updateProducts = new Timer(); 
    ...... 
} 

創建另一個方法,StopUpdates,例如,當其被稱爲將停止計時:

public void StopUpdates() 
{ 
    updateProducts.Stop(); 
} 

現在停止計時器該窗口的OnUnloaded事件:

private void MyPage_OnUnloaded(object sender, RoutedEventArgs e) 
{ 
    var timer = this.Resources["getProducts_timer"] as GetProducts; 
    if (timer != null) 
     timer.StopUpdates(); 
} 
+0

非常感謝Blachshma。您的解決方案完美運作 – RobHurd