右键单击选择TreeViewItem

时间:2013-08-20 15:48:19

标签: c# wpf treeview selecteditem right-click

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

除了hierachicalDataTemplate之外,我一直关注的

This question几乎与此问题完全相同。我的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();    
}

因此,为了清楚起见,我右键单击的节点未按预期选择。我做错了什么,我该如何解决?

更新

我想我知道在解决下面的答案之后出了什么问题。我在这个问题中的代码实际上并没有改变所选的项目,只是通过选择当前选择的项目重新选择它。如果有办法将所选项目实际更改为右键单击的项目,则它将完美运行。关于如何做这样的事情的任何线索?

感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

@ alex2k8对this question的回答正是我所寻找的,也是我用来解决问题的方法。

感谢任何帮助过的人。

答案 1 :(得分:1)

对不起,我很抱歉。 好吧,我正在使用MS VS 2017 15.9.1版。

所以-您通过鼠标右键选择treeviewItem的所有方法都不起作用-我不知道为什么。

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

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 马克

答案 2 :(得分:0)

请参阅下面的示例代码段,以便能够获取所选项目

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>

答案 3 :(得分:-2)

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

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

if chosenDay == dayName.text