2010-01-02 63 views
1

在我的WPF應用程序中,我實現了LINQ to SQL查詢,它填充了一個與ListView連接的Observable集合。它是在這種方法,我可以從somwhere調用,它工作正常:如何使用LINQ to SQL類的PropertyChangedEventHandler進行即時更新?

private void VisualizeAllShows() 
{ 

    MyfirstdbDataContext context = new MyfirstdbDataContext(); 
    _ShowQuCollection.Clear(); 

    var sh = from p in context.Shows select p; 

    foreach (var p in sh) 
     _ShowCollection.Add(new ShowsQu 
     { 
      Date = p.Date, 
      Time = p.Time, 
      Description = p.Description 
     });     
} 

現在我需要此更新自動發生數據庫表數據更改。

我應該爲此目的而使用這個公共事件在我的LINQ to SQL類:

public event PropertyChangedEventHandler PropertyChanged; 

如果是這樣,請,如何使用事件處理程序這將火從數據變化? 如果不是,我應該在哪裏尋找正確的方法來做到這一點?

回答

2

據我所知,沒有什麼來自數據庫引擎,通知您的應用程序更新SQL服務器上的表。最好的選擇是在SQL Server上使用CLR集成來添加它,請參閱#3。

以下是我能想到的選項: 1.通過重複查詢數據庫來檢查更改以查詢更改。 2.我已經看到SqlCacheDependancy用於這個,但從我讀的是CPU密集型。 3.將CLR程序集添加到在觸發器中實現了代碼的SQL Server中,以便更新隨後運行.NET代碼,通知您的應用程序更新。如果你能夠得到這個工作,它可能是最有效的。我不確定在編寫用於SQL Server上的CLR集成的.NET代碼時有什麼限制。即無論它是否允許您連接到外部應用程序。您如何溝通可能因網絡技術,TCP/IP,WCF,遠程處理等不同而不同。

+0

我喜歡使用SQLCLR觸發器發佈更改通知的想法。我讓客戶將更改通知發佈到WCF服務,該服務基本上爲每個其他客戶端保留一個阻塞隊列通知。它的規模很好(因爲請求實際上一直在阻塞),但它依賴於客戶端的合作。 – Josh 2010-01-02 13:56:26

2

如果ShowsQu對象的屬性發生更改,則使用INotifyPropertyChanged.PropertyChanged事件。 ObservableCollection已經實現INotifyCollectionChanged來通知其內容何時更改。

你說的是數據庫中的更改會自動觸發刷新集合。所以PropertyChanged事件在這裏不適用。

你想要做的事情可能會變得非常複雜。最簡單的(也是最不可伸縮的)解決方案是在定時器上輪詢表。我過去所做的是使用「廣播」機制,其中每個客戶端都調查一個阻塞的WCF服務,直到事件可用。然後,當任何客戶端更新數據庫時,他們會向所有其他客戶端廣播一個事件,讓他們知道他們應該刷新其UI。這種通知在你的情況下可能是過度的,並且在我的回答中肯定也是深入的。但希望它能指向正確的方向。