gpt4 book ai didi

c# - TreeView 上下文菜单在 HierarchicalDataTemplate 中不起作用

转载 作者:行者123 更新时间:2023-12-02 17:40:54 25 4
gpt4 key购买 nike

我有一个 TreeView,它工作得很好。在这个菜单中,我有一个上下文菜单,它工作得很好,除了手头的问题命令之外。

我认为主要部分在这里:

<TreeView x:Name="ScenesTreeView01" Grid.Column="0" Width="Auto" Background="AliceBlue" ItemsSource="{Binding Scenes}" SelectedItemChanged="TreeView_SelectedItemChanged" BorderThickness="0">
<TreeView.DataContext>
<viewModels:ScenesViewModel />
</TreeView.DataContext>
<TreeView.Resources>
<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="#F7D073" Offset="0"/>
<GradientStop Color="#F1A62F" Offset="1"/>
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<ContextMenu x:Key="SceneLevel">
<MenuItem Header="Add selected character" Command="{Binding AddSelectedCharacter}"/>
</ContextMenu>
<ContextMenu x:Key="CharacterLevel">
<MenuItem Header="Character Level"/>
</ContextMenu>
</TreeView.Resources>

这里:

<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Characters}">
<StackPanel Orientation="Horizontal" ContextMenu="{StaticResource SceneLevel}">
<TextBlock Text="{Binding SceneName}"></TextBlock>

<Image Source="{StaticResource ImgBook1}" Margin="0,0,5,0" Width="32" Height="32"/>

</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
<StackPanel Orientation="Horizontal" Margin="3" ContextMenu="{StaticResource CharacterLevel}">

<TextBlock FontFamily="Levenim MT" FontSize="16" VerticalAlignment="Center" MinWidth="50" Text="{Binding FirstName}"></TextBlock>

<Image Source="{Binding ImgIcon}" Margin="2" Width="32" Height="32"/>

</StackPanel>
</Border>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>

第二个并不是很重要,但它显示了两个上下文菜单的使用位置。正如我所说,它们按预期出现。

至于我的命令...我之前在这个项目中使用过命令,并且在这个项目的其他地方也使用过它们。我使用 MicroMVVM 的“RelayCommand”来创建它们,到目前为止它们工作得很好。

有问题的命令位于“ScenesViewModel”类中,正如您可能想象的那样,它是一个 View 模型。

命令的代码在这里:

void AddSelectedCharacterExecute()
{
MessageBox.Show("Adding character");
return;
}

bool CanAddSelectedCharacterExecute()
{
return true;
}

public ICommand AddSelectedCharacter { get { return new RelayCommand(AddSelectedCharacterExecute, CanAddSelectedCharacterExecute); } }

目前它并没有做太多事情,但我什至无法让 MessageBox 出现。断点显示当我单击上下文菜单项时未到达代码。

我在这里错过了一些明显的东西吗?或者是过程中的某些事情?一个模糊的想法是,因为 ViewModel 附加到 TreeView,所以 TreeView.Resources 可能还不知道它?我想我正在捕获救命稻草。

如有任何帮助,我们将不胜感激。

最佳答案

您应该能够使用 {x:Reference} 绑定(bind)到 ScenesViewModel 的属性:

<TreeView.Resources>
...
<ContextMenu x:Key="SceneLevel">
<MenuItem Header="Add selected character" Command="{Binding Path=DataContext.AddSelectedCharacter, Source={x:Reference ScenesTreeView01}}"/>
</ContextMenu>
...
</TreeView.Resources>

关于c# - TreeView 上下文菜单在 HierarchicalDataTemplate 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42928896/

25 4 0