2012-07-22 78 views
0

嗨我在使用Windows Phone Silverlight C#應用程序時出現問題。Silverlight應用程序UI更新

所以我想要做這樣的事情

  1. 按下一個頁面上的一個按鈕。按鈕點擊處理程序調用其他類中的異步方法MakeRequest來檢索數據。異步方法將觸發事件DataReadyEvent並將結果封裝爲DataEventArgs。此事件的處理程序將位於Page2中。因此,在爲此事件添加處理程序之後,我從當前頁面導航到Page2。
  2. 我想通過第2頁代碼中的事件處理程序檢索數據並更新UI上的數據。但事件處理程序是靜態的(這樣我可以通過在頁面1代碼中使用Page2.handler_method_name而不創建新的頁面實例來添加它)。由於處理程序方法是靜態的,我不能使用Dispatcher.Invoke並返回到UI線程並更新UI。

那麼在這種情況下,任何人有任何想法嗎?我只想調用page1中的異步方法,並將結果更新爲page2中的UI。謝謝

回答

1

這是一個想法:不要把它變成靜態的。不要試圖通過破壞封裝等簡單的OOP規則來爲自己創建問題,並且通過在您使用的框架中尋找一些瘋狂的解決方法。

當你處於這種情況時,你應該停下來,回頭想一想,因爲這表示你做了一件完全錯誤的事情。不要試圖通過發現黑客和變通辦法來進一步推動它。相反,你應該重構和重用正確的範例。

例如,如果你想在Page2上顯示結果,那麼就是Page2 ALREADY。所以有一個它的實例。爲什麼你想要使用靜態處理程序呢? 可能因爲您沒有對此頁面的引用。這很好,通常你不應該。

但是,當你完成你的計算,你可以發佈一個事件說:「嘿,這是任務完成」。那時你不應該關心誰對這個結果感興趣,那不是工人的顧慮。 這意味着計算本身的邏輯可能應該從Page1中移出。真的,頁面關注的是圓頂演示邏輯,僅此而已。 Page1應該提出需要完成一些計算的請求。這裏將會有一個外部組件(可能是你ViewModel中的一些東西)來實現它。因此,當結果準備好被使用時,您可以簡單地將其推入ViewModel(更新一些可觀察的屬性或集合等),因此如果有任何UI(或其中許多或其他組件)感興趣在這個數據中它將被自動通知並且數據將被顯示。

但是請不要試圖繞開它,它會導致你在未來更大的痛苦。