2017-02-20 6 views
2

Ich versuche, ursprünglichen Wert auf WPF Treeview zu erhalten.Wie erhalten Sie den ursprünglichen Wert in TreeView?

üblicherweise Treeview wir Punkt‘

object Item = treeview1.SelectedItem; 
MessageBox.Show(Item.ToString()); 

mit Original-Wert erhalten ausgewählt, sondern um meine Versuche, es mit dieser Methode nicht erfolgreich war.

Wenn ich es versuchen, dann bekomme ich eine "WPFName+TreeItem" MessageBox

Dies ist mein Code mit 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> 

Kann ich ursprünglichen Wert erhalten foreach oder andere Methoden verwenden?

+0

'TreeViewItem.Selected' ist ein' RoutedEvent', die Ihre TreeView sprudelt. RoutedEvents haben eine 'OriginalSource'-Eigenschaft, die dafür ausreichen sollte. Wenn mit * "Original Value" * das Item gemeint ist, das zum Generieren der Instanz des ItemTemplate innerhalb des TreeViewItems verwendet wurde, verwenden Sie einfach den 'DataContext' Ihres' TreeViewItem'. –

Antwort

0

Sie können die SelectedItem-Eigenschaft in eine TreeItem-Eigenschaft umwandeln und anschließend die Data-Eigenschaft an den entsprechenden Typ übergeben. Sie können dann wie gewohnt auf alle Eigenschaften Ihrer Klassen zugreifen.

Es ist unklar, welche Art „Kanal“ ist aber der folgende Beispielcode sollten Sie die Idee geben:

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

Ich liebe dich. Vielen Dank! –

Verwandte Themen