2009-11-26 92 views
0

我在我的Wpf應用程序中使用Prism進行導航。我有幾個模塊,每個模塊都通過使用引導程序中的IoC容器發送的常用命令在主菜單中註冊。菜單條目綁定到常見的導航命令 - 這將在某些區域打開正確的視圖。全部基於我通過Prism網站找到的建議。棱鏡 - 有條件導航

我現在的問題是,我有一個模塊,其中有一個條件說明如果我想打開主區域中的ViewA或ViewB。示例:假設我有一個客戶模塊 - 然後是一個「客戶」菜單項,它將在主視圖中打開客戶模塊。還有一個條件:如果我有一個活躍的客戶,我想在點擊菜單項時打開CustomerDetailsView,否則我想打開CustomersAdminView。

解決此問題的建議方法是什麼?我看到了一些選擇,但我認爲他們都聽起來有點冒失。現在我正在創建上面示例中的MasterCustomerView。然後這個視圖將檢查條件並打開UserControl,給出Admin的詳細信息。儘管我對這個解決方案並不滿意 - 它會是一種合法的方法嗎?好點?

回答

2

在我圍繞Prism構建的菜單系統中,我爲註冊視圖的模塊提供了重載,允許它們傳遞委託,而不是視圖的類型。在此代表中,我可以將相關信息傳遞給代表,以便決定如何創建其視圖。

這有點複雜,但我可以給你一些相關的例子。這裏

public interface IMenuRegistry 
{ 
    void RegisterMenuItem(string title, 
          Func<RelevantInformation, Object> executeFunction, 
          Func<RelevantInformation, bool> canExecuteFunction); 

    void RegisterMenuItem(string title, Type viewType); 
} 

通知我有一個是在「RelevantInformation」可以包含當前客戶等。當用戶點擊菜單項,我所說的委託和傳遞的所有信息傳遞的類型它可能需要作出決定。它返回一個View對象,然後我可以放入任何適合的區域。

我還允許模塊傳遞一個「canExecute」委託,類似於Command的工作方式(實際上,我將所有菜單註冊並將它們轉換爲Commands)。這樣,如果相關信息中的某些條件會使菜單項無效,模塊也可以選擇禁用自身。

事實上,這只是解決這個問題的很多方法之一,但這與我所做的很接近。希望你找到它有幫助,或者讓你考慮替代方法來解決問題。

+0

感謝您的回覆。我開始實施類似的方法,但很顯然,這會變得有點複雜。所以如果有更好的解決方案,我想這樣做。研究用事件聚合來解決問題。看起來很有希望。 – stiank81

+0

我以前見過一個事件聚合器解決方案,並且肯定會起作用(這是我最初的方式),但它變得非常混亂,並且您失去了關注點分離......您正在使模塊負責操作菜單系統。它*起初感覺不錯,但很快變得難以管理,特別是如果您有其他開發人員製作模塊。 –

+0

對我來說,看起來合理的是,模塊本身在需要時決定做什麼。這樣做菜單項只是一個標題和點擊時觸發的事件。至少現在我發現這比在菜單項中構建邏輯更合理。 – stiank81