Как добавить событие MouseDoubleClick на C# в TreeViewItem

Я новичок в программировании WPF и С#.

Я пытаюсь создать из кода TreeView для добавления данных из моей базы данных. Данные разделены на две части:

  • Имя клиента
  • Некоторые даты

У меня первая часть данных это основной TreeViewItem, а вторые, даты, висят от первой в TreeView. Все данные формируются в виде строки.

Я добавляю их в свой TreeView следующим образом:

// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
item.ItemsSource = entry.Value.ToArray(); // Adding also the dates
item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
try
{
    Arbol_Clientes.Items.Add(item);
}
catch( Exception error)
{
    Console.WriteLine("ERROR: " + error.ToString());
}

Проблема в том, что когда я нажимаю на дату TreeView, событие вызывается именем клиента, например:

Как добавить событие MouseDoubleClick на C# в TreeViewItem

Когда я дважды щелкаю красную дату, событие получает синий TreeViewItem как тот, который вызвал обработчик, в коде обработчика hijo — это "ABM" вместо "/2019 0:00:00":

Код обработчика:


private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs {

    var hijo = sender as TreeViewItem;

    ItemsControl parent = GetSelectedTreeViewItemParent(hijo);

    TreeViewItem treeitem = parent as TreeViewItem;
    string Nombre_Cliente = treeitem.Header.ToString();

    Etiqueta.Content = Nombre_Cliente + " " + hijo.Header.ToString();
}

Конечный результат, которого я хочу добиться со всем этим, выглядит примерно так: xaml:

<TreeView Grid.Column = "0" BorderThickness = "0" x:Name = "Arbol_Clientes">
                <TreeViewItem Header = "ABM" IsExpanded = "True">
                    <TreeViewItem Header = "Enero 2019" MouseDoubleClick = "TreeViewItem_MouseDoubleClick"/>
                    <TreeViewItem Header = "Febrero 2019" MouseDoubleClick = "TreeViewItem_MouseDoubleClick"/>
                </TreeViewItem>
                <TreeViewItem Header = "VCF" IsExpanded = "True">
                    <TreeViewItem Header = "Enero 2019" MouseDoubleClick = "TreeViewItem_MouseDoubleClick"/>
                </TreeViewItem>
            </TreeView>

Попробуйте проверить существующую тему stackoverflow.com/questions/4497825/….

Pavel Anikhouski 18.03.2019 19:09

Мне не хватает написать, что я начинаю программировать на этом языке и в этой IDE, поэтому я не очень понимаю эти ответы, поэтому я действительно не знаю, сможет ли этот поток решить мою проблему. Я попробую, но мне нужно изучить многое из того, что ответил пользователь. Спасибо.

Josete Manu 18.03.2019 19:25

Чем вам будет лучше сначала понять основы MVVM, а также WPF и концепции привязки.

Pavel Anikhouski 18.03.2019 19:28

@PavelAnikhouski Эта ветка не имеет отношения к этому вопросу.

Shawn Kendrot 18.03.2019 22:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
252
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem

Вы не получаете события для элементов даты, потому что не подписываетесь на эти элементы. Только узлы верхнего уровня присоединяют событие. Вы захотите подписаться на событие для дочерних элементов

Вместо этого попробуйте следующее:

// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
foreach (var date in entry.Value.ToArray())
{
    var child = new TreeViewItem();
    child.Header = date;
    child.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Only subscribe to the child
    item.Items.Add(child);
}
try
{
    Arbol_Clientes.Items.Add(item);
}
catch (Exception error)
{
    Console.WriteLine("ERROR: " + error.ToString());
}
Ответ принят как подходящий

Вы можете получить ссылку на родителя TreeViewItem выбранного элемента (e.OriginalSource), используя класс VisualTreeHelper:

private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var hijo = FindParent<TreeViewItem>(e.OriginalSource as DependencyObject);
    //...

}

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

Это именно то, что я искал! Спасибо, работает нормально!

Josete Manu 22.03.2019 09:16

Другие вопросы по теме