gpt4 book ai didi

c# - WPF TabControl上下文菜单在mvvm中右键单击项目

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:49 41 4
gpt4 key购买 nike

我有一个将 ViewModel 列表显示为选项卡控件项的应用程序。项目列表数据绑定(bind)到父 ViewModel 上的属性。现在我想添加一个上下文菜单以支持对 TabItems 的每个 操作(而不是整个 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 标签,为每个项目注册的 DataTriggers 将在子 ViewModel 上执行,但 View 模型没有执行事件的方法和属性。

有没有可能解决这个问题?如何向每个项目添加上下文菜单以支持以下操作:“关闭此”、“保存此”、“关闭除此之外的所有内容”


更多信息:我使用 Caliburn.Micro 作为框架并使用它的约定来绑定(bind) TabControlItems ViewModel 上的属性,它是一个 IObservableCollection<LocationDetailsViewModel>通过从 Conductor<LocationDetailsViewModel>.Collection.OneActive 继承我的 ViewModel 创建. LocationsDetailsViewModel也继承自 Screen

一切都按预期进行。如果我将一个项目添加到 Items属性(property)TabControl得到正确更新。我想添加一个 ContextMenu 每个 TabControl项目,可通过右键单击标题访问。上下文菜单应包含操作,如“关闭此”、“保存此”、“关闭除此之外的所有内容”为此,我向 StackPanel 添加了一个上下文菜单。它控制标题的设计并使用 CM 在 View 模型上调用适当的方法。但是当我调用它时,出现异常告诉我找不到合适的方法。我仔细检查了一下,似乎 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 不会像预期的那样继承以用于绑定(bind)目的。

您需要将 ContextMenu.DataContext 绑定(bind)到 ContextMenu.PlacementTarget.DataContext,在本例中为 StackPanel.DataContext

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

关于c# - WPF TabControl上下文菜单在mvvm中右键单击项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29544807/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com