【问题标题】:Why is the WPF TreeViewItem.Expanded "sender" passing TreeView instead of TreeViewItem?为什么 WPF TreeViewItem.Expanded“发件人”通过 TreeView 而不是 TreeViewItem?
【发布时间】:2016-07-08 03:21:41
【问题描述】:

如何访问正在展开的 TreeViewItem(或者更确切地说是对象)?在我看来,事件处理程序的“发送者”应该是 TreeViewItem 而不是 TreeView。我想在展开时对绑定到 TreeViewItem 的对象进行操作。

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    Loaded="Window_Loaded">
<StackPanel>
    <TreeView x:Name="treeView" HorizontalAlignment="Left" VerticalAlignment="Top" 
              TreeViewItem.Expanded="treeViewItem_Expanded" >
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</StackPanel>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Element root = new Element() { Name = "root" };
        Element a1 = new Element() { Name = "a1" };
        Element a2 = new Element() { Name = "a2" };
        Element b1 = new Element() { Name = "b2" };
        root.Add(a1);
        root.Add(a2);
        a2.Add(b1);
        treeView.ItemsSource = root;
     }

    private void treeViewItem_Expanded(object sender, RoutedEventArgs e)
    {
        TreeViewItem tvi = sender as TreeViewItem;
        tvi = e.Source as TreeViewItem;
        TreeView tv = sender as TreeView;
    }

    public interface IElement
    {
        string Name { get; set; }
    }

    public class Element : ObservableCollection<IElement>, IElement
    {
        public string Name { get; set; }
    }
}

【问题讨论】:

  • e.OriginalSource 实际上是一个 TreeViewItem。

标签: wpf treeview


【解决方案1】:

使用TreeViewItem.Selected 事件。冒泡到树视图的选定事件(TreeViewItem 本身在设计时不存在,因为我们使用的是 HierarchicalDataTemplate)。

可以在 XAML 中这样捕获事件:

<TreeView TreeViewItem.Selected="TreeViewItemSelected" .../> 

那么最后选择的TreeViewItem可以在事件中设置为:

private void TreeViewItemSelected(object sender, RoutedEventArgs e)
{
    TreeViewItem tvi = e.OriginalSource as TreeViewItem;

    // set the last tree view item selected variable which may be used elsewhere as there is no other way I have found to obtain the TreeViewItem container (may be null)
    this.lastSelectedTreeViewItem = tvi;

    ...
 }

【讨论】:

  • 点击展开箭头不会触发 Selected 事件。
  • 我已经测试了你的代码。它不为我显示任何树视图。请发布工作代码,以便有人可以重现该问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多