C# TreeView事件持续启动

C# TreeView事件持续启动,c#,wpf,events,c#-4.0,treeview,C#,Wpf,Events,C# 4.0,Treeview,我使用的是WPF版本的TreeView(System.Windows.Controls.TreeView),需要分配几个事件。由于这些是WPF,大多数事件要么不同,要么以不同的方式运行,因此我对AfterExpand的混淆不可用 目前,我需要两项活动: 选择TreeView级别的EditemChanged 位于TreeView项目级别的ExpandedEvent 到目前为止我有 private void DisplayGetEventTypes(UXEvent.GetEventTypes

我使用的是WPF版本的TreeView(System.Windows.Controls.TreeView),需要分配几个事件。由于这些是WPF,大多数事件要么不同,要么以不同的方式运行,因此我对AfterExpand的混淆不可用

目前,我需要两项活动:

选择TreeView级别的EditemChanged 位于TreeView项目级别的ExpandedEvent

到目前为止我有

    private void DisplayGetEventTypes(UXEvent.GetEventTypesResp resp, CustomAsyncStateContainer state)
    {

        navBarControl.Groups.Clear();

        if (resp.eventTypeItems != null)
        {
            UXEvent.EventType[] eventItems = resp.eventTypeItems;

            int nodeCount = eventItems.Length;
            for (int i = 0; i < nodeCount; i++)
            {
                UXEvent.TryEvent eventItem = new UXEvent.TryEvent();
                eventItem.eventName = eventItems[i].name;
                eventItem.eventId = eventItems[i].id;

                NavBarGroup group1 = new NavBarGroup();

                group1.Header = eventItems[i].name;
                group1.Tag = eventItem;

                group1.IsExpanded = false;

                //Add dummy treeview to fill later if expanded
                System.Windows.Controls.TreeView treeview = new System.Windows.Controls.TreeView();
                treeview.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(myTreeView_SelectedItemChanged);
                AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(myTreeView_ItemExpanded));
                group1.Content = treeview;
                group1.DisplaySource = DisplaySource.Content;

                navBarControl.Groups.Add(group1);

            }

        }
    }
private void DisplayGetEventTypes(UXEvent.GetEventTypesResp,CustomAsyncStateContainer状态)
{
navBarControl.Groups.Clear();
if(resp.eventTypeItems!=null)
{
UXEvent.EventType[]eventItems=resp.eventTypeItems;
int nodeCount=eventItems.Length;
for(int i=0;i
以及以下两个用于测试的草案事件处理程序

    void myTreeView_SelectedItemChanged(object sender,
    RoutedPropertyChangedEventArgs<object> e)
    {
        // Set the data context of the text block to the selected value.
        var node = (ItemsControl)e.OriginalSource;
        System.Windows.Forms.MessageBox.Show("Selected!");

    }

    void myTreeView_ItemExpanded(object sender, RoutedEventArgs e)
    {
        // Set the data context of the text block to the selected value.
        var node = (TreeViewItem)e.OriginalSource;

        System.Windows.Forms.MessageBox.Show("Opening! - " + node.Header);

    }
void myTreeView\u SelectedItemChanged(对象发送方,
RoutedPropertyChangedEventArgs(e)
{
//将文本块的数据上下文设置为选定值。
var node=(ItemsControl)e.OriginalSource;
System.Windows.Forms.MessageBox.Show(“选中!”);
}
void myTreeView_ItemExpanded(对象发送方,路由目标)
{
//将文本块的数据上下文设置为选定值。
var node=(TreeViewItem)e.OriginalSource;
System.Windows.Forms.MessageBox.Show(“打开!-”+节点.标题);
}
我遇到的问题是,当任何TreeView项目展开时,
myTreeView\u ItemExpanded
会多次触发。我认为由于事件冒泡,它会多次开火

首先,有人能给我指出一些好的资源,让我了解这种行为吗

其次,我如何修改我的代码,使之成为
AddHandler(TreeViewItem.ExpandedEvent,newroutedEventHandler(myTreeView_ItemExpanded))仅一个事件


谢谢

我发现了这个问题。线路

AddHandler(TreeViewItem.ExpandedEvent,newroutedEventHandler(myTreeView_ItemExpanded))

应该读

treeview.AddHandler(TreeViewItem.ExpandedEvent,newRoutedEventHandler(myTreeView_ItemExpanded))


我假设第一行必须已将事件处理程序添加到所有可用控件中,并在事件触发时触发所有控件。

基本上,您希望只触发一次哪个事件?ItemExpanded或SelectedItemChanged?是的,
myTreeView\u ItemExpanded
会多次启动,我只希望它启动一次。SelectedItemChanged工作正常。