2013-08-20 68 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