2009-08-01 42 views
0

的TreeView我有下面的類結構:問題與在Silverlight

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

class User 
{ 
    string Name; 
} 

我不能修改這些類。 我需要在一個TreeView控件中顯示關於組織和用戶的所有信息。即,組織節點應該包含子組織和用戶節點。 問題是如何在Silverlight中沒有CompositeCollections或Multibindings?

回答

1

該解決方案的棘手部分是不得不處理每個節點下面的兩個集合,並且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之類的東西。

-1

我誤解了這個問題 - 我不知道SL樹的方式是將Children屬性 Users屬性顯示爲子節點。您可能希望創建一個包含AllChildren屬性的包裝類,該屬性返回相同集合中的用戶和組織。 SL樹的HierarchialDataTemplate具有一個名爲ItemsSource的屬性,該屬性應綁定到單個子集合。對不起,我無法提供更多幫助 - 我會刪除這個答案,但我沒有看到辦法做到這一點。

+0

此XAML不會執行用戶正在查找的內容。它在哪裏顯示關於用戶集合的什麼細節以及什麼是ShortTitle? – 2009-08-02 08:14:59