0

前言:

我有以下 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(基于数据绑定动态生成)。

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

问题:

如何才能做到这一点?

4

1 回答 1

1

我不确定为什么没有在嵌套的 TreeViewItem 上处理 Selected 事件,但是如果我们稍微改变它以在 TreeView 上设置 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;
}
于 2012-08-04T09:27:21.817 回答