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).
Dieser XAML macht nicht das, wonach der Benutzer sucht. Wo werden Details zur Benutzersammlung angezeigt und was ist ShortTitle? –