【问题标题】:WPF C#: How to get treeviewitem header from HierarchicalDataTemplateWPF C#:如何从 HierarchicalDataTemplate 获取 treeviewitem 标头
【发布时间】:2017-02-08 08:03:05
【问题描述】:

我正在使用 HierarchicalDataTemplate 动态构建我的 TreeView,但不知道如何从 treeview 中获取所选项目的标题。

我试图通过 TreeViewItem.Selected 事件来获取它。

    private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = e.OriginalSource as TreeViewItem;
        string name = item.Header.ToString();
    }

但 'item.Header' 的类型是 Node

这是我的 XAML 代码:

<Window x:Class="MaschinenStoppScheduler.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MaschinenStoppScheduler"
    Title="MaschinenStoppScheduler" Height="500" Width="900" Loaded="Window_Loaded_1">
<Window.DataContext>
    <MyNamespace:MainWindowVM />
</Window.DataContext>
<Grid>
    <TreeView x:Name="TreeViewGroups" TreeViewItem.Selected ="TreeViewItem_OnItemSelected"  
        ItemsSource="{Binding RootNodes}" HorizontalAlignment="Left" Margin="20,28,0,25" 
        VerticalAlignment="Stretch" Width="181" SelectedItemChanged="TreeViewGroups_SelectedItemChanged">
        <ItemsControl.ItemContainerStyle>
            <Style
            TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
        <ItemsControl.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type MyNamespace:Node}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </ItemsControl.ItemTemplate>
    </TreeView>
</Grid>

【问题讨论】:

    标签: wpf header treeview selecteditem hierarchicaldatatemplate


    【解决方案1】:

    是的,所选项目将是 RootNodes 中的项目之一。将其转换为该类型。 Node,似乎是。标题将是您用于标题的该类的任何属性——Name,看起来像。

    private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        var treeView = sender as TreeView;
    
        var selectedNode = treeView.SelectedItem as Node;
    
        TreeViewItem tvi = treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem) as TreeViewItem;
    }
    

    Node 是您在TreeView 上绑定到ItemsSource 的集合中包含的类。我还包含了演示如何获取所选TreeViewItem 的代码。

    【讨论】:

    • 完成:((Node)item.Header).Name;
    • 谢谢!另一个问题: SelectedItemChanged 事件返回 SelectedItem 为空。请解释原因
    • private void TreeViewGroups_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { TreeViewItem treeViewItem = TreeViewGroups.SelectedItem as TreeViewItem; }
    • @sanjar14 你的意思是当它变为 null 时?
    • 在我的示例中,“treeViewItem”始终为空。我的问题是为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多