2013-08-20 2 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 = отправитель как TreeViewItem; if (Item! = null) {Item.IsSelected = true; } ' –

+0

Пробовал это без везения. Странный. –

+0

Возможный дубликат [Выбрать узел TreeView в правом щелчке перед отображением ContextMenu] (http://stackoverflow.com/questions/592373/select-treeview-node-on-right-click-before-displaying-contextmenu) –

ответ

4

Ответ на @ alex2k8 на this question именно то, что я искал, и что я использовал для решения моей проблемы.

Спасибо всем, кто помог.

0

Пожалуйста, смотрите образец фрагмент кода ниже Wich может получить выбранный элемент

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

Я получение ошибки времени InvalidCastException' для строки 'TreeView itm = (TreeView) ...'. И затем, когда я попытаюсь исправить это, введя в 'TreeViewItem', он говорит, что' System ... TreeViewItem' не содержит определения для «SelectedItem» ... Почему это? Я чувствую, что этого не должно быть. –

+0

@ Эрик после темноты: не «TreeViewItem itm», это «Item itm». Вы выбрасываете выделение для TreviewItem. это не правильно. Посмотрите мой код и используйте ту же строку –

+0

Я не использую 'List', хотя я использую' ObservableCollection '. –

-2

Это может быть немного устаревшим, но я нашел очень хорошее решение. По крайней мере, имо.

TreeView теперь поддерживает событие NodeMouseClick, в котором вы можете выбрать щелкнутый узел.

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

это для оконных форм – elios264

Смежные вопросы