TreeView事件继续射击

时间:2012-08-26 13:18:53

标签: c# wpf events c#-4.0 treeview

我正在使用TreeView的WPF版本(System.Windows.Controls.TreeView)并需要分配多个事件。由于这些是WPF,因此大多数事件要么不同,要么以不同的方式表现,因此我的困惑是AfterExpand不可用

现在我需要2个活动:

在TreeView级别的SelectedItemChanged 在TreeViewItem级别的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);

            }

        }
    }

以及以下两个用于测试的草稿事件处理程序

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

    }

我遇到的问题是myTreeView_ItemExpanded在展开任何treeviewItem时多次触发。我认为由于事件冒泡,它会多次发射。

首先,有人能指出一些我可以阅读这种行为的好资源吗?

其次,我如何修改我的代码以使AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(myTreeView_ItemExpanded));成为单个事件?

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。这条线

AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(myTreeView_ItemExpanded));

应该阅读

treeview.AddHandler(TreeViewItem.ExpandedEvent, new RoutedEventHandler(myTreeView_ItemExpanded));

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