2017-02-20 67 views
2

我尝试在WPF treeview上获得原始值。如何在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或其他方法?

+0

'TreeViewItem.Selected'是'RoutedEvent'是冒泡的树视图。 RoutedEvents具有一个'OriginalSource'属性,对此应该足够了。如果按*“原始值”*,则表示用于在TreeViewItem内部生成ItemTemplate实例的Item,只需使用“TreeViewItem”的'DataContext'。 –

回答

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()); 
} 
+0

我爱你的家伙。非常感谢! –

相关问题