2017-06-21 28 views
0

我在外殼視圖中使用棱鏡TabControl RegionWPF如何執行當前活動tabitem的命令?

每個TabItem包含AViewAViewModel

我可以使用AViewModel中的屬性IsActive屬性確定當前活動的TabItem

IsActive只有當前選定的TabItem屬性設置爲true

我有Shell視圖內的按鈕,它負責執行TabItems內視圖的邏輯。

什麼啓用禁用根據當前活動TabItem(組可以執行commandtruefalse按鈕,僅用於有源視圖執行邏輯的正確方式。從放置在其他視圖中的按鈕?

我已設法通過創建composite command執行command,然後註冊從AViewModel命令到composite command,並且shell內的按鈕結合composite command

這種方法的問題是,如果任何命令的返回false他們都是除了一個(主動TabItem,沒有命令的執行。

CompositeCommand類維護子命令列表 (DelegateCommand實例)。 CompositeCommand類的Execute方法簡單地依次調用每個 子命令上的Execute方法。 CanExecute方法類似地調用每個子命令的CanExecute方法,但是如果任何子項 命令不能被執行,則CanExecute方法將返回false。 換句話說,默認情況下,只有在所有子命令都可以執行時才能執行復合命令 。 Source

+0

就是這樣,在大型應用程序中,例如像使用Prism的區域,您總是保存活動區域。正是因爲這個原因,當你必須執行一個命令並在特定的上下文中處理它時。所以在你的ViewModel中擁有活動區域是不夠的,你必須讓它暴露並且可用於系統範圍。 – Mishka

回答

1

如果您使用的是CompositeCommand,只希望在活動標籤調用命令,然後有你的ViewModels實施IActiveAware。然後在CompositeCommand的ctor中,通過true作爲參數。這將只監視活動選項卡。

+0

我正在使用這個,但命令似乎不工作,按鈕總是禁用,即使我一直返回true。 – IBRA

+0

我已經通過將命令IsActive屬性設置爲當前活動值來修復它。 'MyCommand.IsActive = IsActive',但我需要爲每個命令執行此操作,有沒有更好的方法?或這是一個可接受的解決方案? – IBRA

+0

你應該如何去做。在IsActive屬性設置器中,將Command.IsActive屬性設置爲該值。 –

0

創建已知兩個選項卡的視圖模型和外殼的視圖模型的服務。當選項卡視圖模型變爲活動狀態時,它將向服務宣告自己。 shell視圖模型或者查看命令的服務(依次轉發到活動選項卡視圖模型),或者(首選),服務託管命令並僅使用選項卡視圖模型提供的信息。

0

CompositeCommand顯然是錯誤的命令,因爲它設計用於在多個目標上執行,並且您只希望它在單個目標(活動視圖模型)上執行。

沒有看到代碼或XAML,這是很難給出建議,但假設XAML看起來是這樣的:

<Grid> 
<Grid.RowDefinitions> 
    <RowDefiniton Height="Auto" /> 
    <RowDefinition /> 
</Grid.RowDefinitions> 

<Button Grid.Row="0" Content="Execute on Active" /> 
<TabControl Grid.Row="1" ItemSource="{Binding TabViewModels}" prism:RegionManager.RegionName="TabRegion" IsSynchronisedWithCurrentItem="True" /> 

<Grid> 

然後對活動項目執行命令最簡單的方法是設置命令使用表示當前項目的「/」語法將按鈕上的屬性設置爲活動視圖模型的TargetCommand。

<Button Grid.Row="0" Content="Execute on Active" Command="{Binding TabViewModels/TargetCommand}" /> 
+0

不正確。它也適用於單個活動區域,並忽略所有其他區域。 –