2009-08-01 11 views
0

Ich habe die folgende Klassenstruktur:Problem TreeView in Silverlight

class Organization 
{ 
    string Name; 
    List<User> users; 
    List<Organization> Children; 
} 

class User 
{ 
    string Name; 
} 

ich diese Klassen nicht ändern kann. Ich muss alle Informationen über Organisationen und Benutzer in einem TreeView-Steuerelement anzeigen. Das heißt, Organisationsknoten sollten Unterorganisation und Benutzerknoten enthalten. Die Frage ist, wie kann ich dies ohne CompositeCollections oder Multibindings in Silverlight tun?

Antwort

1

Der knifflige Teil dieser Lösung besteht darin, dass Sie sich mit zwei Sammlungen unter jedem Knoten beschäftigen müssen, und TreeViews HierarchicalDataTemplate unterstützt nur die Bindung an eine einzelne ItemsSource.

Eine Option besteht darin, ein ViewModel zu erstellen, das die Auflistungen zu einer einzigen Klasse zusammenfasst, die einen Eintrag in der TreeView darstellt, an den Sie dann innerhalb Ihrer HierarchicalDataTemplate binden können.

Zuerst habe ich meine Viewmodel Klasse:

public class TreeViewEntry 
{ 
    public string Name { get; set; } 
    public IEnumerable<TreeViewEntry> Children { get; set; } 
    public object Model { get; set; } 
} 

Dann habe ich eine Funktion, einige Linq und einige Rekursion alle Objekte in einer einzigen Sammlung zu ziehen:

private IEnumerable<TreeViewEntry> OrganizationsToTreeViewEntries(IEnumerable<Organization> orgs) 
{ 
    return (from o in orgs 
      select new TreeViewEntry 
      { 
       Name = o.Name, 
       Model = o, 
       Children = (from u in o.Users 
          select new TreeViewEntry 
          { 
           Name = u.Name, 
           Model = u 
          } 
          ).Concat(OrganizationsToTreeViewEntries(o.Children)) 
      }); 
} 


public MainPage() 
{ 
    InitializeComponent(); 

    var items = OrganizationsToTreeViewEntries(existingOrganizationData); 
    OrgTree.ItemsSource = items; 
} 

Nun, da ich Eine zusammengeführte ItemsSource ist einfach zu stylen Meine HierarchicalDataTemplate:

<UserControl.Resources> 
    <common:HierarchicalDataTemplate x:Key="OrgTemplate" ItemsSource="{Binding Children}"> 
     <StackPanel> 
      <TextBlock Text="{Binding Name}" /> 
     </StackPanel> 
    </common:HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}"> 
    <controls:TreeView x:Name="OrgTree" HorizontalAlignment="Left" Margin="8,8,0,8" Width="225" ItemTemplate="{StaticResource OrgTemplate}" /> 
</Grid> 

Sie können ein Val verwenden ueConverter, um Dinge wie FontWeight zu optimieren, wenn Sie den visuellen Stil bestimmter Elemente anpassen möchten (ich habe beispielsweise in FontWeight einen ValueConverter erstellt, der an die Model-Eigenschaft von TreeViewEntry gebunden war).

-1

ich die Frage falsch verstanden - ich weiß nicht, einen Weg für den SL Baum sowohl die Kinder Eigenschaft und die Benutzer Eigenschaft als untergeordneten Knoten angezeigt werden soll. Möglicherweise möchten Sie eine Wrapper-Klasse mit einer AllChildren-Eigenschaft erstellen, die Benutzer und Organisationen in derselben Auflistung zurückgibt. Die HierarchialDataTemplate der SL-Struktur hat eine einzige Eigenschaft namens ItemsSource, die an eine einzelne untergeordnete Sammlung gebunden sein sollte. Entschuldigung, ich könnte nicht mehr Hilfe sein - ich würde diese Antwort löschen, aber ich sehe keinen Weg, das zu tun.

+0

Dieser XAML macht nicht das, wonach der Benutzer sucht. Wo werden Details zur Benutzersammlung angezeigt und was ist ShortTitle? –

Verwandte Themen