private void ASTTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e) { if (e.NewValue != null) { var selectedTreeItem = ((TreeViewItem)e.NewValue); TreeProperties.Items.Clear(); if (selectedTreeItem.Tag is RedNode) { var redNode = selectedTreeItem.Tag as RedNode; foreach (var property in redNode.GetType().GetProperties()) { TreeProperties.Items.Add(new { Name = property.Name, Value = property.GetValue(redNode, null) }); } TypeProperty.Text = redNode.GetType().Name; KindProperty.Text = redNode.Kind.ToString(); var textRange = SourceCode.Selection; var startPos = SourceCode.GetTextPointerAtOffset(redNode.Span.Start); var endPos = SourceCode.GetTextPointerAtOffset(redNode.Span.Start + redNode.Span.Length); SourceCode.Selection.Select(startPos, endPos); } if (selectedTreeItem.Tag is SyntaxToken) { var token = selectedTreeItem.Tag as SyntaxToken; TypeProperty.Text = token.GetType().Name; // + " " + token.Value.GetType().Name; KindProperty.Text = token.Kind.ToString(); foreach (var property in token.GetType().GetProperties()) { TreeProperties.Items.Add(new { Name = property.Name, Value = property.GetValue(token, null) }); } var textRange = SourceCode.Selection; var startPos = SourceCode.GetTextPointerAtOffset(token.Span.Start); var endPos = SourceCode.GetTextPointerAtOffset(token.Span.Start + token.Span.Length); SourceCode.Selection.Select(startPos, endPos); } } }