2014-12-01 74 views
0

想象一下,您有兩個視圖,ViewModel InfoViewModel顯示有關人員的信息,ViewModel SearchViewModel處理搜索人員和選擇結果。使用棱鏡導航將數據返回到以前的ViewModel

我希望InfoViewModel能夠啓動一個搜索過程,最終將導致SearchViewModel告訴視圖InfoViewModel有人被選中。另一個潛在的要求是,InfoViewModel可以與SearchViewModel進行通信,說這個結果是不可接受的,並且用戶應該選擇其他人(這應該在沒有搜索結果屏幕消失並重新出現的情況下發生)

通常這很容易解決InfoViewModel給SearchViewModel一個回調,只要選擇了一個結果就會被調用。該回調函數還可以有一個返回參數,指定結果是否良好,以便SearchViewModel可以清理自己。然而,看起來Prism似乎不鼓勵這種做法,因爲至少在棱鏡4.0中,沒有一種好的方法來將對象作爲參數進行導航(您只能將字符串作爲參數傳遞)。我使用的一種解決方法是使用服務來存儲對象參數,然後可以通過字符串guid在下一個視圖中唯一標識這些對象參數。這有它自己的問題,但更糟糕的是,感覺像棱鏡有意設計反對這樣做。

另一種方式似乎是當選擇一個人時使用IEventAggregator廣播事件。我必須根據唯一的ID來過濾每個事件,以確保我收到的事件適合我(由於某種原因有兩個搜索過程正在進行)。感覺這種方式只是試圖模仿直接回調,但以一種迂迴的方式。

有誰知道一個很好的解決方案嗎?如果答案是在Prism 4.0中沒有解決這個問題的好方法,那麼你必須使用Prism 5.0(因爲它支持傳遞對象參數),那也沒問題。我只是想知道還有什麼其他的想法

回答

1

有可能不只是一個「正確」的答案,只是有不同的方法。

您可以使用Prism5中的NavigationParameters類導航到傳遞細節的視圖。如果僅限於Prism4,則可以將參數放在RegionContext中,然後通過INavigationAware接口的OnNavigatedTo方法訪問它們。

關於「返回」結果,這可能取決於應用程序的佈局。如果允許多個視圖,則註冊並通過事件代理程序使用事件是推薦的不同組件之間通信的方式。如果你只有一個視圖,並且你覺得事件代理是不必要的,也許是矯枉過正的,那麼可以考慮使用與SearchViewModel配對的服務來存儲結果(與你看起來已經做的不一樣)。任何其他ViewModel都可以注入該服務,因此他們將能夠訪問SearchViewModel設置的任何屬性詳細信息。

如果搜索在邏輯上被限制在父視圖內,請考慮使用InteractionRequest來彈出搜索視圖。