2012-08-26 70 views
0

我正在使用WPF版本的TreeView(System.Windows.Controls.TreeView)并需要分配几个事件。由于这是WPF的大部分事件是不同或以不同的方式表现,因此我的混乱AfterExpand不可TreeView事件不断发射

现在我需要2个事件:

SelectedItemChanged这是在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); 

      } 

     } 
    } 

和测试

以下两个事件处理程序草案
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));只有一个事件?

谢谢

+0

基本上,你想要哪个事件只触发一次? ItemExpanded或SelectedItemChanged? –

+0

是的,'myTreeView_ItemExpanded'会多次触发,我只希望它触发一次。 SelectedItemChanged工作正常。 – user3357963

回答

0

我发现了这个问题。该生产线

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

应该读

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

我认为第一行必须添加事件处理程序所有可用的控制,当事件触发所有被解雇。