2009-03-05 35 views
8

Tôi đang cố gắng tìm đủ thông tin về thuộc tính Inheritance Tree (hoặc Inheritence Context) được sử dụng bởi DependencyObjectDependencyProperty.Tùy chỉnh cây thừa kế DependencyObject

Tôi muốn sử dụng khả năng kế thừa giá trị của DependencyProperty bên ngoài một trang WPF điển hình, sao cho đối tượng A là đối tượng logic B, và do đó giá trị được gán cho thuộc tính trên đối tượng A sẽ tự động chuyển sang đối tượng B trừ khi nó được thiết lập cục bộ (một chút giống như thuộc tính FlowDirection hoạt động trong WPF).

Nếu đối tượng A và đối tượng B được derieved từ DependencyObject, và không trẻ em của một UIElement (nói cách khác, đối tượng A là riêng của nó gốc), sau đó làm thế nào để bạn thiết lập các cây logic để DependencyProperty hiểu rằng B là con của A?

Hillberg Freezable Trick cũng như Josh Smith's bag of tricks không hoàn toàn là những gì tôi đang tìm kiếm. Tôi không muốn truy xuất thuộc tính từ cây phần tử hiện có ... Tôi muốn tạo cây phần tử không phải của riêng tôi ... tức là có quyền kiểm soát ngữ cảnh kế thừa.

Bất kỳ ai biết cơ thể tri thức này đang ẩn ở đâu?

+1

Tôi tò mò về cách bạn giải quyết vấn đề của mình. Bạn đã viết cơ chế cây/thừa kế/DP của riêng bạn? Tìm bất kỳ thư viện nào để giúp bạn trên con đường của bạn? Tôi đang cố gắng làm một cái gì đó tương tự. –

Trả lời

10

Sau nhiều nghiên cứu và muddling qua mã nguồn cho DependencyObject, đây là trả lời ngắn gọn:

The (tài sản đó cho thấy phụ huynh logic của một thể hiện) InheritenceContext là (như 90% của việc thực hiện hữu ích của DependencyObject) được đánh dấu là nội bộ và do đó giữ ẩn từ tất cả các mã bên ngoài WindowsBase.dll

Có thể sử dụng phản chiếu để đặt trường _contextParent, cũng như gọi phương thức ẩn này để đặt InheritenceContext, nhưng vào cuối ngày của nó không phải là một giải pháp sạch sẽ.

Sau khi tẩy rửa mã nguồn DependencyObject, tôi phải nói rằng tôi không ấn tượng. DependencyObject có thể và phải là một lớp học rất sạch sẽ, phổ biến, có thể tái sử dụng. Thay vào đó nó có cấu trúc và hành vi ràng buộc với những người kế thừa, và thậm chí chứa các hằng số, trường, phương thức và công việc cụ thể để giúp Freezable cùng tồn tại với các phân lớp còn lại. nhưng cũng làm cho một lớp tuyệt vời khác hoàn toàn không thể sử dụng bên ngoài khung công tác WPF.

+1

Chúc mừng cho câu trả lời cho câu hỏi thú vị này. Đó là một sự xấu hổ rằng các loại tài sản yêu cầu một lớp cơ sở cụ thể, mặc dù tôi không thể nghĩ ra một giải pháp tốt hơn nhút nhát của ngôn ngữ/hỗ trợ trình biên dịch (tương tự cho Freezable). –

+0

Bạn có thể chia sẻ giải pháp bạn đã làm không? Bạn đã thực hiện "DependencyObject" của riêng mình chưa? – Nock

0

Tôi giả định rằng bạn đang hỏi về việc tuyên truyền giá trị cho trẻ em không tự ghi đè giá trị.

Khái niệm về phần tử WPF có con được giới thiệu bởi ContentControl theo như tôi biết. Điều này đi vào chơi nhiều hơn nữa xuống cấp bậc hơn bạn muốn đi. Vì vậy, tôi sẽ giả định rằng nếu bạn chỉ đơn giản là lấy được từ DependencyObject rằng hành vi này sẽ không biểu hiện.

Cụ thể, trẻ cần biết để hỏi cha mẹ nếu nó không có giá trị cho một tài sản cụ thể.

Câu hỏi thú vị. Tôi cũng muốn biết câu trả lời đầy đủ.

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