Một tài sản phụ thuộc là gì?


Câu trả lời:


94

Các thuộc tính phụ thuộc là các thuộc tính của các lớp xuất phát từ DependencyObject và chúng đặc biệt trong đó thay vì chỉ sử dụng trường sao lưu để lưu trữ giá trị của chúng, chúng sử dụng một số phương thức trợ giúp trên DependencyObject.

Điều thú vị nhất ở họ là họ có tất cả hệ thống ống nước để liên kết dữ liệu được tích hợp. Nếu bạn liên kết một cái gì đó với họ, họ sẽ thông báo cho họ khi họ thay đổi.


36
Điều đó vẫn cho tôi biết rất ít về những gì một tài sản phụ thuộc có thể làm, hoặc tại sao nó tồn tại. Bạn không đề cập gì đến tài sản có giá trị nhất của họ, giải quyết giá trị lên cây phần tử.
ProfK

xin chào @Matt Hamilton, cảm ơn bạn đã trả lời - nhưng ý của bạn là "họ sử dụng một số phương thức trợ giúp trên DependencyObject."?
BKSpurgeon

2
@BKSpurgeon DependencyObject có một số phương thức như "SetValue" và "GetValue" mà bạn gọi để lưu / đọc giá trị của thuộc tính phụ thuộc, thay vì sử dụng trường sao lưu.
Matt Hamilton

91

Lời giải thích duy nhất tôi thấy hữu ích và được viết tốt là đây: http://www.wpftutorial.net/dependencyproperIES.html

Về cơ bản, DependencyProperies khác với các thuộc tính thông thường ở chỗ chúng không chỉ là setters / getters cho các trường trong lớp, mà chúng còn tự động truy xuất các giá trị thực của chúng trong thời gian chạy. Các SetValue()phương pháp của người bị ảnh hưởng là khá đơn giản và thiết lập giá trị cục bộ của tài sản với giá trị bạn đã cho nó. Tuy nhiên, khi bạn cố gắng GetValue()từ DependencyProperty, trước tiên, nó sẽ tìm giá trị cục bộ, nếu không có giá trị nào (có thể tồn tại trong DependencyProperies không giống như các thuộc tính thông thường), nó sẽ tiếp tục cây UI hợp lý cho đến khi tìm thấy giá trị đó. Nếu khung đã đạt đến đỉnh của cây mà không tìm thấy bất kỳ giá trị cục bộ nào, thì nó sẽ sử dụng giá trị mặc định được xác định trước làm giá trị của thuộc tính.

Phương pháp này cho phép DependencyProperies tiêu thụ ít bộ nhớ hơn các thuộc tính thông thường do chỉ các giá trị được người dùng đặt rõ ràng sẽ được lưu trữ cục bộ.

Và, như đã đề cập ở trên, DependencyProperies cũng cho phép chúng tôi liên kết với chúng trong mã XAML và đặt các kích hoạt trên chúng, điều mà trên các thuộc tính thông thường không được phép.

Tôi hy vọng tôi đã xoay sở để xóa đi một số sự mơ hồ :)


2
Và "Tài sản đính kèm" là gì?
Paul-Sebastian Manole

12
Tài sản đính kèm là một tài sản không thuộc về mục hiện tại đang được khai báo, nhưng ảnh hưởng đến một đối tượng khác. Ví dụ: Grid.Row="1"trên Buttondi chúc sẽ đặt nó ở Hàng số 2 trên cha mẹ Grid(do thực tế là các hàng dựa trên số không) nhưng RowDependencyProperty thuộc về Gridđối tượng.
Jonathan Perry

2
Khi bạn nói DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed, ý bạn là cả ràng buộc trong XAML và cài đặt kích hoạt hoặc chỉ cài đặt kích hoạt không được phép. Cảm ơn đã theo dõi và giúp làm cho mọi thứ rõ ràng hơn!
Paul-Sebastian Manole

@ Paul-SebastianManole DataTriggers cũng hoạt động trên các thuộc tính thông thường. Giả sử bạn có một Valuetài sản (Không phải DP) có giá trị 0 và bạn muốn chế độ xem của mình thực hiện điều gì đó khi Valuethay đổi thành 1. Bạn sẽ có thể làm như vậy bằng cách sử dụng DataTriggervà đặtBinding={Binding Path=Value, Value=1}
Jonathan Perry

36

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ cung cấp một giải thích tốt về các thuộc tính phụ thuộc cả trong bối cảnh của WF và WPF.

Một đoạn trích:

Điểm chính - Giá trị của các thuộc tính phụ thuộc được giải quyết

Mục tiêu cuối cùng của một tài sản phụ thuộc, giống như bất kỳ tài sản nào, là quản lý nhà nước. Nhưng không giống như các thuộc tính .Net bình thường, giá trị thuộc tính cục bộ không được lưu trữ trong một biến thể hiện.

Thay vào đó, các thuộc tính phụ thuộc được đăng ký với khung thuộc tính phụ thuộc và giá trị thuộc tính cơ bản được giải quyết - có nghĩa là giá trị được xác định bởi khung thuộc tính phụ thuộc dựa trên các quy tắc được xác định bởi đăng ký thuộc tính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.