2017-02-20 70 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

我愛你的傢伙。非常感謝! –