通过 ContextMenu 内的样式定义时,MenuItem 命令不执行

问题描述 投票:0回答:1

我正在尝试使用 TreeView 创建一个文件树,我可以在其中绑定一个集合。为了绑定到 TreeView,您需要使用 HierarchicalDataTemplate。这会自动使用默认的 TreeViewItem 作为其基础。但我无法直接访问此 TreeViewItem 来添加内容。这就是为什么我使用样式和设置器访问此 TreeViewItem 的属性。

现在,当我通过此样式添加 ContextMenu 时,分配给 MenuItems 的所有命令和事件都不会触发。当我右键单击 MenuItem 时,ContextMenu 仍然显示正常。

<TreeView ItemsSource="{Binding FileTree}">
    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu Width="250">
                        <!-- This command never gets executed when the menu item is clicked -->
                        <MenuItem Header="New File" Command="{Binding NewFile}" />
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Resources>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type model:FileTreeModel}"
                                  ItemsSource="{Binding Path=Children}">
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding FileName, Converter={StaticResource FileNameToIconConverter}}"
                        Width="14" Height="12" Margin="5,0,5,0" SnapsToDevicePixels="True"
                        Stretch="Fill" />
                <TextBlock Text="{Binding Path=FileName}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
public class FileTreeModel
{
    public string? FileName { get; set; }
    public string? Path { get; set; }
    public IList<FileTreeModel> Children { get; set; } = [];
}
public ObservableCollection<FileTreeModel> FileTree { get; }
public ICommand NewFile { get; }

public ExplorerViewModel(INewFileService newFileService)
{
    FileTree = [];
    NewFile = new RelayCommand(() =>
    {
        Console.WriteLine("New file"); // Never gets ran
        newFileService.NewFile();
    });
}

c# wpf xaml
1个回答
0
投票

如果不知道如何设置数据上下文,就不可能对你的问题给出准确的答案。

可能的变体之一:

<Window -------------------
        -------------------
        DataContext="{DynamicResource vm}">
    <Window.Resources>
        <local:FilesTreeViewModel x:Key="vm"/>
    </Window.Resources>


    ----------------------------

                    <ContextMenu Width="250">
                        <!-- This command never gets executed when the menu item is clicked -->
                        <MenuItem Header="New File"
                                  Command="{Binding NewFile, Source={StaticResource vm}}"/>
                    </ContextMenu>


    ----------------------------
© www.soinside.com 2019 - 2024. All rights reserved.