2017-09-01 34 views
5

Tôi muốn hiển thị một số đối tượng trong một lần xem trang, nhưng rất tiếc là không thành công.TreeView với danh sách lồng nhau

Tôi đã một ObservableCollection <ICustom> của các đối tượng: Settings.ListOfCustomers

Giao diện của đối tượng ICustom:

int Id { get; } 
int age { get; } 
CustomerType CustomerType { get; } 
ObservableCollection<IValue> ListOfValues { get; } 

Các ObservableCollection<IValue> ListOfValues cũng có một số đặc tính như:

String Name { get; } 

Xem của tôi:

<TreeView ItemsSource="{Binding ListOfCustomers, UpdateSourceTrigger=PropertyChanged}"> 

    <TreeView.Resources> 

     <HierarchicalDataTemplate DataType="{x:Type customerConfig:ICustomer}"> 
      <TextBlock Text="{Binding Id}"/> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type valueConfig:IValue}" ItemsSource="{Binding ListOfValues}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

    </TreeView.Resources> 


</TreeView> 

Câu hỏi: Tôi làm cách nào để hiển thị các đối tượng này trong TreeView? Cách tiếp cận của tôi (xem "My View") không hoạt động.

+0

ITemSource phải là ListOfCustomers. Nó giả định rằng u muốn sửa đổi các thiết lập mà chỉ là tài sản getter. Hãy thử cách khác – Ramankingdom

Trả lời

3

Câu hỏi 1: ObservableCollections có lợi thế, tất cả thông báo cho chế độ xem được thực hiện tự động. Vì vậy, bạn không phải lo lắng về sự kiện NotifyPropertyChanged để thêm/xóa đối tượng khỏi bộ sưu tập.

Câu hỏi 2: ViewModelDataContext của bạn? Tôi không thấy nơi có tài sản ObservableCollection<ICustomer>? Bạn có thể cung cấp thêm chi tiết về các mối quan hệ trong các lớp học này không?

EDIT:

Dựa trên câu trả lời của mm8, x: Loại thuộc tính nên có một loại bê tông. Vì vậy, các mã nên giống như thế này:

tôi đề nghị rằng bạn có một ObservableCollection<ICustomer> ListOfCustomers trong ViewModel của bạn, sau đó bạn có thể ràng buộc trong giao diện:

<TreeView ItemsSource="{Binding ListOfCustomers}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type Customer}"> 
       <TextBlock Text="{Binding Id}"/> 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate DataType="{x:Type modSettings:Value}" 
           ItemsSource="{Binding ListOfValues}"> 
       <TextBlock Text="{Binding Name}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

Tôi nghĩ chủ đề này cung cấp một giải pháp chi tiết hơn cho bạn vấn đề: Implement WPF treeview with different Parent Nodes a well as different child nodes?

EDIT2:

tôi đã thay đổi mã của tôi một chút, để phù hợp với yêu cầu của bạn. Điều này sẽ hiển thị tất cả các nút:

<TreeView ItemsSource="{Binding ListOfCustomers}" > 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=ListOfValues}" DataType="{x:Type Customer}"> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type modSettings:Value}"> 
         <TextBlock Text="{Binding Path=Name}"/> 
        </HierarchicalDataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
       <TextBlock Text="{Binding Path=Id}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
+0

Bằng cách này, tôi chỉ có thể thấy các đối tượng của ListOfCustomers – Philies

+0

Xin lỗi, đã xảy ra lỗi trong quá trình triển khai của tôi. Tôi đã chỉnh sửa câu trả lời của mình bằng đúng mã. Tôi hy vọng điều này sẽ giải quyết vấn đề của bạn. –

2

tôi đã chuyển đổi tất cả các danh sách để ObservableCollection, cũng Danh mục lồng nhau. Điều này có cần thiết và chính xác không?

Không cần thiết trừ khi bạn có ý định thêm các mục vào bộ sưu tập động trong thời gian chạy. Sau đó, bạn cần sử dụng một số ObservableCollection<T> để chúng tự động hiển thị trong TreeView. Bạn cũng có thể sử dụng List<T>.

Tôi làm cách nào để hiển thị các đối tượng này trong một TreeView?

Bạn nhận được thông báo lỗi vì bạn thêm các mẫu vào thuộc tính Items của TreeView. Chúng phải được thêm vào thuộc tính Resources, tức là bạn cần thêm phần tử <TreeView.Resources>.

Bạn cũng nên đọc:

Why can't a DataTemplate bind to an interface when that DataTemplate was explicitly returned from a DataTemplateSelector?

Templates với DataType bất động sản thiết lập để một kiểu giao diện không được áp dụng. Vì vậy, bạn nên xác định một loại HierarchicalDataTemplate cho mỗi loại bê tông hoặc sử dụng DataTemplateSelector.

Các vấn đề liên quan