2012-08-03 105 views
0

序言:附加事件处理程序到动态创建TreeViewItems

我有以下XAML:

<controls:TreeView x:Name="tv"> 
    <controls:TreeViewItem x:Name="tvi" Header="RootNodeTitle" IsExpanded="True"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <controls:TreeViewItem Header="{Binding TextToBindTo}" Selected="TreeViewItem_Selected" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </controls:TreeViewItem> 
</controls:TreeView> 

而下面的.NET代码隐藏:

_viewCollection = New CollectionViewSource() 
_viewCollection.Source = _data.RoleList 
tvi.ItemsSource = _viewCollection.View 

问题:

我想附加一个事件处理程序到Selected事件的tvi的孩子(这是基于数据绑定动态生成的。

我试过在ItemTemplate中使用Selected="..."标记(如XAML中所示),但这不起作用。

问:

如何才能做到这一点?

回答

1

我不知道为什么选定事件不会对嵌套树型视图处理,但如果我们改变它一点点地设置的ItemsSource的树视图,它得到处理:

<controls:TreeView x:Name="tv" SelectedItemChanged="tv_SelectedItemChanged"> 
     <controls:TreeView.ItemTemplate> 
      <DataTemplate> 
       <!-- this Selected event handler does get called --> 
       <controls:TreeViewItem Header="{Binding Name}" Selected="TreeViewItem_Selected" > 
... 

的但是引发的事件不包含任何关于该物品的有用信息,因此您无法从该事件明智地派生出任何有用的信息。

Setting a handler for the SelectedItemChanged event on the TreeView works and also contains the usual OldValue and NewValue properties in the EventArgs.

本次活动还激发了所有TreeViewItems - 嵌套与否。

试试这个:

<controls:TreeView x:Name="tv" SelectedItemChanged="tv_SelectedItemChanged"> 
    <controls:TreeViewItem x:Name="tvi" Header="RootNodeTitle" IsExpanded="True" Selected="TreeViewItem_Selected" > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <controls:TreeViewItem Header="{Binding}" Selected="TreeViewItem_Selected" > 
        <Border Background="Black" Height="25" Width="25" /> 
       </controls:TreeViewItem> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </controls:TreeViewItem> 
</controls:TreeView> 

...

void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    tvi.ItemsSource = GetItems(); 

} 

private IEnumerable GetItems() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     yield return i; 
    } 
} 

private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    var oldItem = e.OldValue; 
    var newItem = e.NewValue; 
} 
+0

谢谢!我结束了与TreeView的'SelectedItemchanged'事件而不是TreeViewItem的'Selected'事件。 – 2012-08-06 21:37:20

+1

我想使用sdk时TreeView.ItemTemplate和sdk:HierarchicalDataTemplate附加扩展事件处理程序到每个TreeViewItem。任何想法如何做到这一点? – Number8 2013-10-30 18:43:21

+0

@ Number8:您是否找到该任务的解决方案? – wollud1969 2014-01-10 15:11:40

相关问题