2013-03-05 85 views
3

問題很簡單: 基本上我的View應該顯示來自WCF服務的數據。數據以高頻率異步更新,因此當服務器端的數據發生更改時,應相應更新GUI。實時應用程序的MVVM設計

該視圖顯示了很多數據,所以基本上它綁定了ViewModel中的50/60字段。

模型部分基本上是一個POCO對象,其中包含顯示在GUI中的50/60字段。是的,ViewModel將Model對象展示給View。 (請注意,Model對象實現INotifyPropertyChanged,以便在屬性值更改時通知View。)

現在,我寫了一個「DataService」層,它與WCF服務交互,並負責根據模型更新模型到由WCF服務返回的數據。當數據在服務器端更新時,出於性能原因,WCF服務僅向客戶端返回已更改的一組字段。

因此,在DataService的存在是管理像下面的WCF服務更新的事件處理程序:

void OnServiceUpdated(UpdateArgs args) 
{ 
    foreach(Field field in args.ChangedFields) 
    { 
     if(field.Key == "BetName") _modelBet.BetName = field.Value; 
     else if(field.Key == "BetUser") _modelBet.BetUser = field.Value; 
     [...] 
     //the same for 50 fields... 
    } 
} 

現在哪個更新模型,是因爲我們只想更新領域需要這個可怕的代碼在服務器端沒有改變的模型。 (請注意,wcf服務API無法更改)。

我的問題是:你有什麼建議,以提高「OnServiceUpdated」處理程序的性能?

由於提前, JHON

回答

2

你說

據我所知,你不希望在UI頻繁效應「的數據與高頻異步更新」。所以你可以使用調度計時器來提醒通知。它在UI線程上工作,與其他定時器不同。

http://msdn.microsoft.com/tr-tr/library/system.windows.threading.dispatchertimer.aspx 以下是SO用戶https://stackoverflow.com/a/15044392/413032的回答。

如果你使用MVVM,所以如果我是你,我使args.ChangedFields名稱和我的ViewModel屬性名稱相等。所以通過反射或使用自動映射器我可以將屬性值傳遞給viewModel屬性。

你也可以在所有屬性設置後產生一個事件並更新UI。

爲了提供這個;

據我所知,您使用結合這樣綁定有模式和updatesourcetrigger選項,這樣你就可以明確地updatesouce。

http://msdn.microsoft.com/en-us/library/cc278072(v=vs.95).aspx#updating_the_data_source http://msdn.microsoft.com/en-us/library/system.windows.data.updatesourcetrigger.aspx

希望向您展示的方式。

+0

嗨達沃,非常感謝您的回答。 好的,感謝您提供Dispatcher TImer,但在這種情況下,UI上的頻繁更新不是問題。 – user1070316 2013-03-05 21:23:45

+0

嗨達沃,非常感謝您的回答。 好的,謝謝你建議Dispatcher TImer,但在這種情況下UI上的頻繁更新不是問題。順便說一句,我會分開處理這個問題。 是的,我已經想到了你提出的解決方案,所以通過使用反射來將屬性值轉換爲viewModel屬性,但出於性能原因,我想避免使用反射。 這是非常有趣的關於自動映射器的建議。我會盡力調查這個方向。 謝謝, 約翰 – user1070316 2013-03-05 21:31:51

+0

有人說這個http://stackoverflow.com/a/8111631/413032方法比反射速度更快。除了我不認爲反射會導致問題。綁定使用反射和1000秒的Textblock對象綁定在1秒以下http://msdn.microsoft.com/en-us/library/bb613546.aspx(呈現時間1.2sn)。當然你可以免費使用自動映射器http://www.codeproject.com/Articles/61629/AutoMapper。這真的取決於你的問題。 – 2013-03-06 07:14:13