如何在C#上将MouseDoubleClick事件添加到TreeViewItem

时间:2019-03-18 17:10:10

标签: c# wpf xaml treeview treeviewitem

我是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 个答案:

答案 0 :(得分:1)

您可以使用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);
}

答案 1 :(得分:-1)

  

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