2013-08-20 60 views
2

我希望能够在我的程序中选择一个TreeViewItem右键单击。以前,(在this question)我试图通过调用SetSelectedItem()方法从我想要允许选择TreeViewItem的任何地方执行此操作。从这个问题的答案编译并运行,但实际上并没有让TreeViewItem成为我想要的选择。选择右键单击的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();  
} 

所以只是为了清楚起见,节点,我右击没有得到像选择预期。我做错了什么,我该如何解决它?

UPDATE:

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

感谢您的帮助。

+0

在'MouseRightButtonDown'的处理程序中,试着写下:'TreeViewItem Item = sender as TreeViewItem; if(Item!= null){Item.IsSelected = true; }' –

+0

试过了,没有运气。奇。 –

+0

[显示ContextMenu之前右键单击选择TreeView节点]的可能重复(http://stackoverflow.com/questions/592373/select-treeview-node-on-right-click-before-displaying-contextmenu) –

回答

4

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

感谢任何帮助过的人。

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> 
+0

我是为'TreeView itm =(TreeView)...'行收到'InvalidCastException'运行时错误。然后,当我尝试通过输入“TreeViewItem”来解决该问题时,它说“System ... TreeViewItem”不包含“SelectedItem”的定义......为什么会这样?我觉得这不应该发生。 –

+0

@Eric天黑之后:不是“TreeViewItem itm”,它是“Item itm”。您正在将selectedItem投射到TreviewItem。那是错的。请参阅我的代码并使用同一行 –

+0

虽然我没有使用'List',但我正在使用'ObservableCollection '。 –

-2

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

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

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

这是用于Windows窗体 – elios264