簡體   English   中英

WPF TabControl上下文菜單在mvvm中右鍵單擊獲取項目

[英]WPF TabControl Context menu get item right-clicked in mvvm

我有一個顯示ViewModels列表作為選項卡控件項的應用程序。 項目列表數據綁定到父ViewModel上的屬性。 現在,我想添加一個上下文菜單來支持每個 TabItem(而不是整個TabControl本身)的操作。

這是有問題的控件:

<TabControl x:Name="Items"
                Grid.Column="2"
                Grid.Row="0"
                Margin="3,5,5,3"
                Visibility="{Binding Path=TabControlVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding DisplayName}" />
                    <Button Padding="10,0,0,0"
                            Content="X"
                            Style="{DynamicResource NoChromeButton}"
                            cal:Message.Attach="CloseTab($dataContext)" />
                </StackPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>

當我將上下文菜單代碼放入TabControl標記中時,上下文菜單將為TabControl整體注冊。 這不是我想要的行為。

如果我將其添加到DataTemplate標簽內的StackPanel標簽中,則為每個Item注冊的DataTriggers將在子ViewModel上執行,但是視圖模型沒有執行該事件的方法和屬性。

有可能解決這個問題嗎? 如何為每個項目添加上下文菜單以支持以下操作:“關閉此”,“保存此”,“關閉除此以外的所有內容”


更多信息:我使用Caliburn.Micro作為框架,並使用其約定將TabControl綁定到ViewModel上的Items屬性,該屬性是IObservableCollection<LocationDetailsViewModel> ,它是通過從Conductor<LocationDetailsViewModel>.Collection.OneActive繼承我的ViewModel創建的。 LocationsDetailsViewModel也從Screen繼承

一切都按預期工作。 如果我將一項添加到Items屬性,則TabControl會正確更新。 我想向每個 TabControl項添加一個ContextMenu ,可通過右鍵單擊標題來訪問它。 然后,上下文菜單應包含操作,例如“關閉此”,“保存此”,“關閉除此以外的所有內容”。為此,我在StackPanel添加了一個上下文菜單,該菜單控制標題的設計並使用CM調用適當的方法在視圖模型上。 但是,當我調用它時,出現了一個異常,告訴我找不到合適的方法。 我仔細檢查了一下,似乎CM希望在LocationDetailsViewModel而不是LocationViewModel上調用方法,即使每個選項卡項目的關閉按鈕中都存在類似的方法調用。

這是帶有上下文菜單的代碼:

<UserControl x:Class="RpgTools.LocationPresenter.Views.LocationView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:cal="http://www.caliburnproject.org"
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:vm="clr-namespace:RpgTools.LocationPresenter.ViewModels"
             mc:Ignorable="d"
             d:DataContext="{d:DesignInstance Type=vm:LocationViewModel, IsDesignTimeCreatable=True}"
             cal:Bind.AtDesignTime="True"
             Padding="5">
<!-- Code left out for brevity -->
 <TabControl x:Name="Items"
                Grid.Column="2"
                Grid.Row="0"
                Margin="3,5,5,3"
                Visibility="{Binding Path=TabControlVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <StackPanel.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Close This"
                                      cal:Message.Attach="CloseTab($dataContext)">
                            </MenuItem>
                        </ContextMenu>
                    </StackPanel.ContextMenu>
                    <TextBlock Text="{Binding DisplayName}" />
                    <Button Padding="10,0,0,0"
                            Content="X"
                            Style="{DynamicResource NoChromeButton}"
                            cal:Message.Attach="CloseTab($dataContext)" />
                </StackPanel>
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>

ContextMenus不像其他控件那樣屬於普通VisualTree的一部分,因此.DataContext不會像預期的那樣出於綁定目的而繼承。

您需要將ContextMenu.DataContext綁定到ContextMenu.PlacementTarget.DataContext ,在這種情況下為StackPanel.DataContext

<ContextMenu DataContext="{Binding 
    RelativeSource={RelativeSource Self},
    Path=PlacementTarget.DataContext}">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM