Как добавить событие MouseDoubleClick на C # в TreeViewItem - PullRequest
0 голосов
/ 18 марта 2019

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

Я пытаюсь создать из кода 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, событие вызывается по имени клиента, например:

TreeView example 1

Когда я дважды щелкаю по красной дате, событие получает синий 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>

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Вы можете получить ссылку на родительский элемент 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);
}
0 голосов
/ 19 марта 2019

item.MouseDoubleClick + = TreeViewItem_MouseDoubleClick; // Здесь проблема

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

Попробуйте вместо этого:

// 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());
}
...