2010-07-15 42 views
5

Tôi có một WPF TreeView với 2 cấp độ dữ liệu và 2 HierarchicalDataTemplate để định dạng từng cấp. Từ HierarchicalDataTemplate ở cấp độ thứ hai, tôi cần phải ràng buộc một thuộc tính trong lớp của cấp độ đầu tiên. Tôi đã thử theo cách này, nhưng nó Dosn't làm việc:Thuộc tính cha mẹ ràng buộc WPF trong HierarchicalDataTemplate

Text="{Binding Path=Ori, RelativeSource={RelativeSource TemplatedParent}}" 

với Ori như tên của propery

Ngay cả trong cách này nó Dosn't công trình:

Text="{Binding Path=tOri, RelativeSource={RelativeSource TemplatedParent}}" 

với tOri là tên của TextBlock trong fisrt HierarchicalDataTemplate liên kết với sự thích hợp Ori.

Bạn có thể giúp tôi không?

Trả lời

9

TemplatedParent chỉ đề cập đến kiểm soát cha mẹ bên trong một ControlTemplate và do đó không hoạt động với DataTemplates. Bạn có thể sử dụng FindAncestor để xác định vị trí TreeViewItem cha và sau đó truy cập DataContext của nó.

Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}, AncestorLevel=2}, Path=DataContext.Ori}" 
+0

Cảm ơn bạn! Tôi đã thử giải pháp của bạn nhưng nó không hoạt động vì tôi không biết tôi phải viết "AncestorLevel = 2" – lamarmora

0

Bạn đã hiểu sai liên kết TemplatedParent trong WPF. TemplatedParent là điều khiển được kế thừa mà bạn đang mở rộng. Ví dụ: nếu tôi đã viết ControlTemplate nhắm mục tiêu Button.

<ControlTemplate TargetType="{x:Type Button}" x:Key="MyButtonTemplate"> 
    <Border BorderBrush="{TemplateBinding Property=Background}" BorderThickness="3" > 
     <ContentPresenter Margin="10"/> 
    </Border> 
</ControlTemplate> 

Điều này ràng buộc BorderBrush vào cơ sở Button.Background thuộc tính.

Để đạt được những gì bạn muốn, bạn cần phải đi bộ cây thị giác bằng cách sử dụng RelativeSource FindAncestor để tìm cha mẹ và sau đó thực hiện ràng buộc. Để giúp thử sử dụng Mole WPF hoặc Snoop.

Lưu ý: bản sao Snoop có sẵn ở trên có một số vấn đề nghiêm trọng, tức là, không được sâu hơn 256 độ. Tôi có một bản vá được mở rộng và nổi bật với tính năng tuyệt vời. Một trao đổi giữa việc sử dụng Mole và Snoop2 để gỡ lỗi/hình dung trong quá trình phát triển.

+1

Phiên bản Snoop mới nhất có tại http://snoopwpf.codeplex.com/ và có tất cả các bản sửa lỗi kết hợp từ các phiên bản khác ngoài đó, ngoài hỗ trợ 32 và 64 bit và .NET 4. Hãy cẩn thận về việc gây nhầm lẫn với Liên kết mẫu với RelativeSource TemplatedParent. Họ là những cơ chế riêng biệt làm những việc tương tự nhưng TemplateBinding thì hạn chế hơn ở chỗ nó chỉ có thể trỏ đến thuộc tính của kiểu khớp trên parent và không có bất kỳ tùy chọn nào khác có sẵn trên Binding (Converters, complex Paths, v.v ..) . –

+0

@John: Cảm ơn bạn đã cập nhật Snoop; Tôi sẽ lấy thông tin mới nhất và tích hợp vào nhánh của tôi - có lẽ có các bản sửa lỗi/tính năng mà tôi có thể đóng góp. – Dennis

+0

@ John: Vâng, tôi nên giải thích sự khác biệt giữa hai người. 'TemplateBinding' còn hạn chế hơn nhiều, như bạn đã giải thích, và nó được giải quyết tại thời gian biên dịch trong khi' RelativeSource TemplatedParent' được giải quyết trong thời gian chạy (sử dụng công cụ Binding). – Dennis

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