gpt4 book ai didi

c# - 调用 WPF 选择 TreeView 项作为上下文菜单

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:26 24 4
gpt4 key购买 nike

这个问题主要与上下文菜单有关,但在我的特定情况下,它与 TreeView 控件有关。

TreeView 项包含一个 StackPanel,StackPanel 上有一个 ContextMenu 属性,我已将其分配给 StaticResource(当然是 ContextMenu)。所述 ContextMenu 导致 ICommand,因此执行其操作。

目前(我相信这是默认行为),右键单击 TreeView 中的项目不会选择该项目。这在 Windows 中很常见,但在这里不会发生。我希望它发生(但我不知道如何发生)。

一些跟进信息:我在 TreeView 中确实有一个选定的项目,它会随着鼠标左键单击而改变。不过,这不是左键单击事件,而是“SelectedItemChanged”事件。这导致我将数据上下文( View 模型)中的“SelectedItem”设置为 SelectedItem 的方法。必须以这种方式完成,因为 TreeView 的选定项是“只读”的。

代码在这里,虽然我不确定它对手头的问题有多大用处:

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (this.ScenesTreeView01 == null)
return;

if (this.ScenesTreeView01.DataContext == null)
return;

var DataContext = this.ScenesTreeView01.DataContext as ScenesViewModel;

if (e.NewValue is SceneViewModel)
{
DataContext.SelectedScene = (SceneViewModel)e.NewValue;
}

if (e.NewValue is CharacterViewModel)
{

DataContext.SelectedCharacter = (CharacterViewModel)e.NewValue;
}
}

因为似乎没有地方显示“好的,你左键单击,所以这里是所选项目”,我不知道该怎么做才能告诉它在右键单击时分配所选项目(以及左键单击)。

我该怎么做?

编辑:我正在使用 MVVM,所以当我们有一个像 SelectedItemChanged 这样的方法时,它的参数是 RoutedPropertyChangedEventArgs e,e.Source 将我引回到我的 View 模型,而不是 TreeViewItem。

最佳答案

您可以将 IsSelected 属性添加到您的 SceneViewModelCharacterViewModel 类,并绑定(bind) IsSelectedTreeViewItem 使用一种样式给这些属性。在相同的样式中,您可以为 PreviewMouseRightButtonDown 连接一个事件处理程序来设置源属性:

<TreeView x:Name="treeView">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<EventSetter Event="PreviewMouseRightButtonDown" Handler="treeView_PreviewMouseRightButtonDown" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem>1</MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
</TreeView>

private void treeView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem tvi = sender as TreeViewItem;
CharacterViewModel cvm = tvi.DataContext as CharacterViewModel;
if (cvm != null)
{
cvm.IsSelected = true;
}
else
{
SceneViewModel svm = tvi.DataContext as SceneViewModel;
if (svm != null)
svm.IsSelected = true;
}
}

确保 CharacterViewModelSceneViewModel 类实现了 INotifyPropertyChanged 接口(interface)并在新的 IsSelected 属性的 setter 。

关于c# - 调用 WPF 选择 TreeView 项作为上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43045718/

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