2010-02-11 45 views
7

Tôi đang cố gắng để có được cái nhìn cây của tôi để nhóm một bộ sưu tập các mặt hàng tương tự bằng những gì họ đang có. Để giữ cho mọi thứ chung chung, hệ thống phân cấp đối tượng của tôi có thể trông như thế này:Nhóm đối tượng con trong WPF TreeView

  • Objects
    • Object Nhóm # 1
      • Item # 1 (Type 'A')
      • Item # 2 (loại 'A')
      • Item # 3 (Type 'B')
      • Item # 4 (Type 'B')

Ngay bây giờ TreeView của tôi cho thấy các đối tượng này giống hệt như mô hình đối tượng, nhưng những gì tôi muốn làm là chèn một nút TreeView đối với từng loại đối tượng để nó sẽ trông như thế này:

  • Objects
    • Object Nhóm # 1
      • Loại A
        • Item # 1
        • Item # 2
      • Loại B
        • Item # 3
        • Item # 4

tôi thấy trong một câu hỏi tương tự ở đây rằng ai đó nên có hai riêng biệt HierarchicalDataTemplates vì vậy tôi tạo ra một cho 'Object Nhóm # 1' trình độ, trong đó có một TreeView với một danh sách các loại, nhưng điều này là thực sự vụng về vì nó là một toàn bộ TreeView riêng biệt bên trong một số nút. Tôi cũng đã cố gắng sử dụng một CollectionViewSource để lọc ra các mục trong mỗi thể loại, nhưng điều này không làm tôi rất nhiều vì tôi không thể tìm ra cách để hiển thị chúng.

Tôi đoán câu hỏi của tôi tóm tắt về điều này: Làm cách nào để tạo một nhóm HierarchicalDataTemplate đó là con cái? Nếu ai đó có thể chỉ cho tôi đúng hướng tôi sẽ đánh giá cao nó rất nhiều.

Tôi có thể đăng một số mã nếu có ai muốn xem, nhưng tôi thực sự chỉ cố gắng tìm ra cách để làm những gì tôi muốn để mã của tôi chỉ là một luồng dữ liệu khá thẳng về phía trước ngay bây giờ.

Trả lời

5

Hãy xem this bài viết của Mr. Sumi. Tôi chắc chắn nó sẽ giúp bạn.

+0

Đây chính xác là những gì tôi cần xem. Cảm ơn. – aalex675

0

AFAIK, HierarchicalDataTemplate không thể nhóm con của nó.

Chế độ xem chỉ hiển thị mọi thứ được hiển thị mà không thực sự đào sâu vào các loại đối tượng/nhóm ... Tại sao bạn không tạo các nhóm này trong mô hình đối tượng của mình?

Và xem sẽ chỉ nhận được smth như:

public interface ITreeNode 
{ 
    string Title; 
    IList<ITreeNode> ChildNodes; 
} 

và hiển thị nó bằng cách sử dụng HierarchicalDataTemplate.

7

Bạn có thể đạt được hiệu ứng này bằng cách liên kết ItemsSource trên HierarchicalDataTempalate bằng cách sử dụng IValueConverter. Bộ chuyển đổi này chỉ đơn giản là thực hiện như sau:

public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, ...) 
    { 
    return 
     from item in (IEnumerable<MyItem>)value 
     group item by item.Type into g 
     select new { Type = item.Type, Items = g }; 
    } 
    ... 
} 

Bây giờ HierarchcialDataTemplate của bạn có thể thực hiện như sau:

<HierarchicalDataTemplate ItemsSource="{Binding SomePath, Converter={x:Static local:MyConverter}"> 

    <HierarchicalDataTemplate.ItemTemplate> 
    <HierarchicalDataTemplate 
     ItemsSource="{Binding Items}" 
     TargetType="{x:Type local:MyItem}" 

     ItemTemplate="{StaticResource MyItemTemplate}"> 
     <!-- may omit ItemTemplate in prior line to use implicit template --> 

     <TextBlock Text="{Binding Type}" /> <!-- Header for type --> 

    </HierarchicalDataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 

    <!-- header for "Object Group #1" --> 

</HierarchicalDataTemplate> 
+1

'chọn mới {Type = item.Type, Items = g};' không biên dịch; có thể 'chọn mới {Type = g.First(). Type, Items = g};'? – arolson101

+1

'chọn mới {Type = g.Key, Items = g}' hoạt động – arolson101

0

Nếu đây là một phương pháp Nhóm đơn giản từ một Bộ sưu tập Flat cho mục đích hiển thị mà bạn đang tìm kiếm có thể sử dụng "CollectionViewSource" sẽ phù hợp hơn. Việc sử dụng LINQ có thể trở thành một cơn ác mộng do sự kiện Thay đổi thuộc tính/Bộ sưu tập Sự kiện.

<CollectionViewSource x:Key="GroupedItems" Source="{Binding ItemsSource, ElementName=My_UserControl}"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="Type" Converter="{StaticResource GroupingConverter}" /> 
    </CollectionViewSource.GroupDescriptions> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="Date"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

<HierarchicalDataTemplate x:Key="GroupDataTemplate" ItemsSource="{Binding Items}" > 
    <TextBlock Text="{Binding Name}" /> 
</HierarchicalDataTemplate> 

<TreeView x:Name="ItemHolder" x:FieldModifier="private" 
    ItemsSource="{Binding Source={StaticResource GroupedItems}, Path=Groups}" 
... /> 
Các vấn đề liên quan