【问题标题】:Select a TreeViewItem on Right-Click右键单击选择 TreeViewItem
【发布时间】:2013-08-22 18:24:54
【问题描述】:

我希望能够在我的程序中右键单击选择TreeViewItem。以前,(在this question 中)我试图通过从我想要允许选择TreeViewItem 的任何地方调用SetSelectedItem() 方法来做到这一点。该问题的答案已编译并运行,但实际上并没有让 TreeViewItem 像我想要的那样被选中。

我一直在研究的This question 与这个问题几乎完全相同,但hierachicalDataTemplate 除外。我的TreeView 没有hierachicalDataTemplate,如果我的程序不需要它,我想避免它。

这是我正在编译的,但现在不影响更改...

//Sets selected item in TreeView and passes to MainWindowViewModel
private void SetSelectedItem()
{
       MainWindowViewModel.SelectedItem = Tree_One.SelectedItem as TreeViewItem;
}

//**** This is the function this question is about -- It's Supposed to select item on RightClick
private void Tree_One_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
       SetSelectedItem();    
}

所以为了清楚起见,我右键单击的节点没有像预期的那样被选中。我做错了什么,我该如何解决?

更新:

我想我在玩弄下面的答案后知道问题出在哪里。我在这个问题中的代码实际上并没有改变选定的项目,它只是通过选择当前选定的项目来重申,重新选择它。如果有一种方法可以将所选项目实际更改为右键单击的项目,它将完美运行。关于如何做这样的事情的任何线索?

感谢您的帮助。

【问题讨论】:

标签: c# wpf treeview selecteditem right-click


【解决方案1】:

请看下面的示例 sn-p 可以得到所选项目

public partial class MainWindow : Window
{
    public List<Item> Items { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Items = new List<Item>();
        for (int i = 0; i < 10; i++)
        {
            Items.Add(new Item() {ItemName="Item " + i.ToString() });
        }
        this.DataContext = this;
    }

    private void TreeView1_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        if ((sender as TreeView).SelectedItem != null)
        {
            Item itm = (Item)(sender as TreeView).SelectedItem;
            Console.WriteLine(itm.ItemName);
        }
    }
}

public class Item
{
    public string ItemName { get; set; }
}

XAML

<TreeView Name="TreeView1" MouseRightButtonDown="TreeView1_MouseRightButtonDown" ItemsSource="{Binding Items}">
        <TreeView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ItemName}" />
            </DataTemplate>
        </TreeView.ItemTemplate>
</TreeView>

【讨论】:

  • TreeView itm = (TreeView)... 行出现InvalidCastException 运行时错误。然后当我尝试通过输入TreeViewItem 来解决这个问题时,它说System...TreeViewItem 不包含'SelectedItem'`的定义......这是为什么?我觉得这不应该发生。
  • @Eric 天黑后:不是“TreeViewItem itm”,而是“Item itm”。您正在将 selectedItem 转换为 TreviewItem。那是错的。请查看我的代码并使用同一行
  • 我没有使用List,我使用的是ObservableCollection&lt;TreeViewItem&gt;
【解决方案2】:

@alex2k8 在this question 上的答案正是我一直在寻找的,也是我用来解决问题的。

感谢所有提供帮助的人。

【讨论】:

    【解决方案3】:

    这可能有点过时,但我刚刚找到了一个非常好的解决方案。至少在我看来。

    TreeView 现在支持 NodeMouseClick 事件,您可以在其中选择被点击的节点。

    private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            this.treeView.SelectedNode = e.Node;
    

    【讨论】:

    • 这是用于 windows 窗体的
    【解决方案4】:

    对不起我的英语不好。 好吧,我正在使用 MS VS 2017 版本 15.9.1。

    所以 - 通过鼠标右键单击选择树视图项的所有方法都不起作用 - 我不知道为什么。

    但我找到了一种可行的方法:

    private void Treeview1_MouseRightButtonDown(object sender, MouseButtonEventArgs e){
    
        // The source from the Mouse Event Args is a TreeViewItem.
        var treeViewitem = e.Source as TreeViewItem;
    
        // Than works your Code in the above Posts!
        if (treeViewitem != null)
        {
            treeViewitem.IsSelected = true;
            e.Handled = true;
        }
    }
    

    cu 马克

    【讨论】:

    • MessageBox.Show(e.Source.GetType().Name); 总是显示 TreeView
    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多