2017-02-20 22 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', что пузыри ваш TreeView. У RoutedEvents есть свойство OriginalSource, которое должно быть достаточным для этого. Если по * «Исходное значение» * вы имеете в виду элемент, который использовался для генерации экземпляра ItemTemplate внутри TreeViewItem, просто используйте 'DataContext' вашего' TreeViewItem'. –

ответ

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

Я люблю парня. Спасибо! –