我正在尝试使用 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();
});
}
如果不知道如何设置数据上下文,就不可能对你的问题给出准确的答案。
可能的变体之一:
<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>
----------------------------