2010-07-16 37 views
5

Tôi muốn tạo một WPF TreeView với hai tùy chọn nhóm (nút radio). Vì vậy, dữ liệu sẽ được nhóm theo hai cách khác nhau trong phân cấp 2 cấp, cấp thấp nhất là các mục dữ liệu thực tế và các nhóm chỉ là cách để thể hiện dữ liệu để dễ hiểu hơn.Dữ liệu nhóm trong WPF treeview

Họ cũng có thể chọn các mục theo nhóm (hộp kiểm) nhưng tôi đã tìm được phần đó, ví dụ: nếu tôi muốn đại diện cho các đối tượng cơ sở dữ liệu và muốn chúng được nhóm theo lược đồ hoặc theo kiểu đối tượng (bảng, dạng xem, hàm, v.v.).

Tôi chỉ không biết làm thế nào tôi nên bắt đầu trên hai chế độ nhóm. Tôi có nên cấu trúc lại hoàn toàn số ObservableCollection của mình bất cứ khi nào chế độ nhóm thay đổi hoặc có cách đơn giản hơn không?

Ngoài ra, điều gì xảy ra nếu mứccho cấp 2 sẽ hơi khác tùy thuộc vào chế độ nhóm, ví dụ: khi được nhóm theo loại đối tượng bạn cần hiển thị lược đồ ở cấp 2?

Có ai có thể cho tôi một số mẹo về cách bắt đầu và sử dụng các kỹ thuật nào không?

Trả lời

3

Nhóm bộ sưu tập của bạn bằng cách đặt GroupDescriptions trên CollectionViewSource. Bạn có thể làm điều đó trong mã bằng cách làm một cái gì đó như thế này:

CollectionViewSource.GetDefaultView(yourCollection).GroupDescriptions.Add(
    new PropertyGroupDescription("PropertyName")); 

Hoặc bạn có thể làm điều đó trong XAML bằng cách tạo ra một CollectionViewSource một cách rõ ràng.

<CollectionViewSource 
     Source="{StaticResource yourCollection}" 
     xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"> 
     <CollectionViewSource.GroupDescriptions> 
      <dat:PropertyGroupDescription PropertyName="PropertyName"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

Nếu bạn đang sử dụng một ItemsControl đơn giản như ListBox thì bạn chỉ có thể đặt thuộc tính GroupStyle. Nếu bạn muốn sử dụng TreeView, thì tôi nghĩ bạn muốn liên kết với thuộc tính Groups trên ICollectionView. Bạn nên đọc entry Bea Stollnitz về nhóm:

+0

Thú vị nhưng tôi không chắc liệu tôi có thể sử dụng điều này hay không. Tôi cần hộp kiểm ở phía trước các mục của tôi ở cả hai cấp độ và kiểm tra một nhóm nên kiểm tra tất cả các mục con, v.v. Tôi đã làm điều đó ngay bây giờ với mã trong mô hình của tôi. Ngoài ra, nếu có một cách xung quanh đó, tôi vẫn sẽ cần phải làm cho PropertyName khác nhau về việc lựa chọn các nút radio, mà tôi tin rằng không thể được thực hiện bởi vì nó không phải là một DependencyProperty ... – Koen

+0

@Koen: Bạn có thể ràng buộc hộp kiểm tra đến CollectionViewGroup với công cụ chuyển đổi tùy chỉnh kiểm tra từng đứa trẻ. Để thay đổi nhóm, bạn có thể làm điều đó trong mã, hoặc trong mã-đằng sau hoặc trong ViewModel của bạn, hoặc bạn chỉ có thể có hai CollectionViewSources được nhóm theo các cách khác nhau và thay đổi cái nào bạn ràng buộc TreeView. – Quartermeister

+6

Cả hai liên kết đều đã chết. –

0

Check this link trên HierarchicalDataTemplate. Có những ví dụ được sử dụng với nhiều loại khác nhau.

+0

Đó sẽ là thực sự là cách tôi muốn làm điều đó nếu tôi chọn để cơ cấu lại toàn bộ ObservableCollection tôi. Tôi chỉ cảm thấy rằng cần có một kỹ thuật thuận tiện hơn cho việc này, giống như với các truy vấn LINQ hoặc một cái gì đó ... – Koen