2009-04-05 46 views
5

Để lưu trữ một đối tượng (ví dụ, một thể hiện của một lớp) trong TreeViewItem, tôi hiện đang lưu trữ đối tượng trong TreeViewItem 's Header và sau đó ghi đè phương thức ToString của lớp đó , để nó hiển thị tiêu đề chuỗi chính xác; Sau đó tôi đưa vật thể trở lại trong một sự kiện.WPF: Lưu trữ đúng đối tượng trong một TreeViewItem


Đây có phải là cách chính xác để đạt được loại điều này hoặc có cách nào tốt hơn, phù hợp hơn không?

Trả lời

7

Cách "thích hợp" là chỉ cần thêm object đến TreeView 's (hoặc TreeViewItem' s) Items việc thu thập và sử dụng một HierarchicalDataTemplate để kiểm soát cách mục được hiển thị:

Person.cs:

public class Person 
{ 
    private readonly ICollection<Person> _children = new ObservableCollection<Person>(); 

    public string Name { get; set; } 

    public ICollection<Person> Children 
    { 
     get 
     { 
      return _children; 
     } 
    } 
} 

Window1.xaml.cs:

public Window1() 
{ 
    InitializeComponent(); 

    var people = new List<Person>(); 
    var kent = new Person() { Name = "Kent" }; 
    kent.Children.Add(new Person() { Name = "Tempany" }); 
    people.Add(kent); 
    _treeView.ItemsSource = people; 
} 

Window1.XAML:

<TreeView x:Name="_treeView"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 
+0

Cảm ơn câu trả lời. Làm thế nào để thực hiện một "lồng nhau HierarchicalDataTemplate" để nói chuyện? Ví dụ, các mục trong binding ItemsSource có một danh sách khác bên trong chúng, và tôi muốn danh sách là một danh sách con của chúng. –

+0

np Dreas. Bạn có thể đánh dấu là câu trả lời và hỏi một câu hỏi riêng biệt về HierarchicalDataTemplates lồng nhau không? –

+0

Xin chào Kent, sẽ làm. –

1

Các "câu trả lời" ở trên theo quan điểm của tôi không trả lời câu hỏi thực tế, và trong thực tế câu hỏi ban đầu chỉ ra rằng tác giả câu hỏi đã có một giải pháp rất hiệu quả cho vấn đề. Tuy nhiên, "câu trả lời" được cung cấp chỉ đơn giản cho thấy cách đính kèm một đối tượng phụ vào một TreeViewItem và cách sau đó trả về nó bằng cách sử dụng một phương thức tùy chỉnh. Trong khi điều này hữu ích, câu trả lời này không giải quyết được bản chất thực sự của câu hỏi gốc.

Có nhiều trường hợp trong đó TreeViewItem cần phải có một đối tượng bên ngoài được đính kèm mà không thuộc danh sách các mục của TreeViewItem. Điều này tạo điều kiện truy cập vào các đối tượng bên ngoài đính kèm cho các mục đích ứng dụng cụ thể khi người dùng chọn TreeViewItem từ TreeView. Khái niệm này hoàn toàn khác với ý tưởng thêm các đối tượng con vào một TreeViewItem.

Một phương pháp thay thế giải quyết vấn đề này, trái ngược với giải pháp ban đầu được thực hiện bởi tác giả câu hỏi, là phân lớp lớp TreeViewItem và thêm thông tin tùy chỉnh, chẳng hạn như đối tượng đính kèm. Nguyên tắc này được minh họa trong bài viết http://msdn.microsoft.com/en-us/library/1330h6a4.aspx. Sau khi thực hiện lớp con TreeViewItem tùy chỉnh này, lớp con này có thể được thêm vào danh sách các mục của một TreeView hoặc một TreeViewItem. Khi người dùng chọn mục từ TreeView, đối tượng được trả về từ vùng chọn sẽ là lớp con tùy chỉnh, sẽ chứa bất kỳ thông tin tùy chỉnh nào mà lớp con đã định nghĩa.

Một lợi thế bổ sung khi sử dụng lớp con TreeViewItem tùy chỉnh thay vì TreeViewItem là hành vi tùy chỉnh có thể được thực hiện bởi lớp con. Ví dụ: để hiển thị chú giải công cụ tùy chỉnh khi người dùng di chuột qua mục, lớp con có thể đặt đối tượng ToolTip cho chính nó bằng mã như:

ToolTip tip = new ToolTip() { Content = "Tooltip display value" }; 
ToolTipService.SetToolTip(this, tip); 
Các vấn đề liên quan