該解決方案的棘手部分是不得不處理每個節點下面的兩個集合,並且TreeView的HierarchicalDataTemplate僅支持綁定到單個ItemsSource。
一種選擇是創建一個ViewModel,將集合合併到一個類中,該類表示TreeView中的條目,然後您可以將它綁定到HierarchicalDataTemplate中。
首先,我建立了我的ViewModel類:
public class TreeViewEntry
{
public string Name { get; set; }
public IEnumerable<TreeViewEntry> Children { get; set; }
public object Model { get; set; }
}
然後我用一個函數,一些LINQ和一些遞歸把所有的對象到一個單一的集合:
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;
}
現在,我有合併的ItemsSource可以很方便地設置我的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>
您可以使用Val如果你想調整某些元素的視覺樣式(例如在我的測試中,我在FontWeight上創建了綁定到TreeViewEntry的Model屬性的ValueConverter),ueConverter可以調整FontWeight之類的東西。
此XAML不會執行用戶正在查找的內容。它在哪裏顯示關於用戶集合的什麼細節以及什麼是ShortTitle? – 2009-08-02 08:14:59