2012-07-24 45 views
0

我具有類似於樣機一個WPF /棱鏡應用如下所示:WPF /棱鏡:嵌套視圖和工具欄

Layout

兩者的TabControls包含單獨的棱鏡區,第二個被嵌套到第一一。現在,工具欄應根據當前處於活動狀態的視圖來激活/取消激活項目。

工具欄目前在shell中定義。

我試過使用某種註冊表,其中每個ViewModel可以註冊它支持的工具欄命令。不過,我後來意識到,工具欄無法知道哪個視圖(以及哪個視圖模型)處於活動狀態。

問題是在嵌套,沒有,我可能達到我想要的綁定TabControl.SelectedItem屬性到工具欄,並從上面使用我的註冊表。

也許有更好的方法來做到這一點?或者讓工具欄找出哪個視圖處於活動狀態?

編輯:我現在試圖用ActiveAware的ViewModels在這篇文章中descriped:http://www.codeproject.com/Articles/56826/ViewModel-Active-Awareness-in-a-Prism-Based-Applic,但是我現在有這個問題,當我從標籤「一號」標籤「二」和背部,嵌套選項卡的「開關第一個標籤「GotFocus事件沒有被觸發,這意味着工具欄將代表錯誤的視圖。

也許這是要走的路?

編輯2:問題似乎是,第二個tabcontrol不在它自己的作用域區域內。我正在使用ViewDiscovery方法將視圖添加到我的區域,所以我沒有在範圍內創建區域管理器。 SyncActiveState似乎只適用於作用域區域,因爲在切換視圖時第一個tabcontrol視圖模型會正確更新。

有沒有辦法使用XAML來創建一個範圍的區域,而不是一個正常的區域?

回答

0

我現在最終創建了一個擴展的TabControl,它使用SelectionChanged事件來設置實現特定接口的所有項目的IsActive。此外,它沿着VisualTree走下去,找到任何擴展的TabControl,併爲這些項目執行相同操作等等。

這裏工作得很好,我們目前只使用TabControls,所以這個解決方案適用於我。

0

如果我正在嘗試這樣做,我可能會創建一個IToolbarManager,它具有用於每個可用工具欄操作的bool屬性,以及一個用於操作本身的ICommand。

然後,在bool屬性更改命令的CanExecute值並調用CommandManager.InvalidRequerySuggested的具體類型中實現此接口。將此類型註冊爲容器的單例,然後使用DI將其注入到每個視圖和外殼中。然後,Shell可以將工具欄按鈕數據綁定到IToolbarManager中的命令,然後視圖可以設置操作是否在初始化時啓用。

我沒有代碼示例,因爲我只是在考慮如何解決此問題,但希望您可以按照我的建議進行操作,而且這很有幫助。

+0

技術上我已經有這樣的東西。然而,這不(至少對我來說)解決了工具欄需要知道哪個視圖處於活動狀態的問題。 – cguedel 2012-07-25 06:05:39

+0

問題確定哪些工具欄按鈕可用,或者工具欄需要知道哪些視圖處於活動狀態?也許我誤解了。在建築方面,我建議保持你的觀點/部分鬆散耦合並實行分離關注。 PRISM的目標之一是消除對獨立組件的需求,以便需要彼此的知識。 – 2012-07-26 01:29:17

+0

問題在於工具欄必須知道哪些按鈕必須處於活動狀態。爲了做到這一點,它必須至少有一點關於活動視圖的知識。 但是,我似乎找不到找出當前哪個視圖處於活動狀態的方法,以便它可以使用eventaggregator將消息發送到工具欄(然後可以激活所需的按鈕)。 – cguedel 2012-07-26 06:01:39

1

這裏的問題是工具欄不知道活動區域的任何內容;他們故意脫鉤。

我會(親自)使用Event Aggregator發佈來自活動ViewModel的消息,說「我當前活躍」,並讓工具欄訂閱這些消息並根據需要更新按鈕。

+0

那麼,但ViewModel如何知道它是否處於活動狀態? IActiveAware似乎沒有同步到嵌套區域,即使基於ViewControl的RegionActiveAwareBehavior和[SyncActiveState]屬性也是如此。 – cguedel 2012-07-25 08:09:26