繁体   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