如何在TreeView中获取原始值?

时间:2017-02-20 07:16:21

标签: c# wpf treeview

我尝试在WPF树视图上获取原始值。

通常,Treeview我们使用

获取所选项目的原始值
object Item = treeview1.SelectedItem;
MessageBox.Show(Item.ToString());

但是,我尝试使用此方法获取它是不成功的。

如果我尝试一下,那么我会得到一个"WPFName+TreeItem" MessageBox

这是我的WPF代码

C#

private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    object temp = treeView.SelectedItem;
    MessageBox.Show(temp.ToString());
}

private static IEnumerable<TreeItem> GetChannelTreeForTreeView(QueryRunner queryRunner)
{
    List<ChannelTreeItem> channelTree = queryRunner.Utils.GetChannelTree(false);

    foreach (ChannelTreeItem channelTreeItem in channelTree)
    {
        TreeItem treeViewItem = new TreeItem { Data = channelTreeItem.Channel };
        FillTreeViewItem(treeViewItem, channelTreeItem);
        yield return treeViewItem;
    }
}

private static void FillTreeViewItem(TreeItem treeViewItem, ChannelTreeItem channelTreeItem)
{
    foreach (ClientListEntry clientListEntry in channelTreeItem.Clients)
        if (clientListEntry.Nickname.Contains("serveradmin from") == false)
        {
            treeViewItem.Children.Add(new TreeItem { Data = clientListEntry });
        }

    foreach (ChannelTreeItem childChannelTreeItem in channelTreeItem.Children)
    {
        TreeItem childTreeViewItem = new TreeItem { Data = childChannelTreeItem.Channel };
        treeViewItem.Children.Add(childTreeViewItem);
        FillTreeViewItem(childTreeViewItem, childChannelTreeItem);
    }
}

public class TreeItem
{
    public object Data { get; set; }
    public List<TreeItem> Children { get; private set; }

    public TreeItem()
    {
        Children = new List<TreeItem>();
    }
}

WPF

<TreeView x:Name="treeView" HorizontalAlignment="Left" 
              Height="265" VerticalAlignment="Top" Width="353" 
              SelectedItemChanged="treeView_SelectedItemChanged"
              MouseUp="treeView_MouseUp">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type self:ViewItemWPF+TreeItem}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <ContentPresenter Content="{Binding Data}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type HelperClasses:ChannelListEntry}">
                <StackPanel Orientation="Horizontal">
                    <Border Background="Green" Width="8" Height="12" BorderBrush="#00000000"></Border>
                    <TextBlock Text="{Binding Path=Name}"/>
                </StackPanel>
            </DataTemplate>
            <DataTemplate DataType="{x:Type HelperClasses:ClientListEntry}" >
                <StackPanel Orientation="Horizontal">
                    <Border Background="DarkBlue" Width="8" Height="12" BorderBrush="#00000000"></Border>
                    <TextBlock Text="{Binding Path=Nickname}" Foreground="blue" />
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="True" />
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>

我可以使用foreach或其他方法获取原始值吗?

1 个答案:

答案 0 :(得分:0)

您可以将SelectedItem属性转换为TreeItem,然后将其Data属性转换为适当的类型。然后,您可以照常访问类的任何属性。

目前还不清楚“频道”是什么类型,但以下示例代码应该为您提供这个想法:

private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    TreeItem temp = treeView.SelectedItem as TreeItem;
    if (temp != null)
    {
        ClientListEntry clientListEntry = temp.Data as ClientListEntry;
        if (clientListEntry != null)
        {
            //Data is a ClientListEntry
            //...
            return;
        }

        Channel channel = temp.Data as ClientListEntry;
        if (channel != null)
        {
            //...
        }

    }
    MessageBox.Show(temp.ToString());
}