Có hai khái niệm ở đây: thuộc tính phụ thuộc và thuộc tính phụ thuộc đính kèm. "Thuộc tính được đính kèm" là các thuộc tính phụ thuộc và phụ thuộc hỗ trợ như vậy property value inheritance.
Về các thuộc tính phụ thuộc cơ bản, một tuyên bố rất thô sẽ là về cơ bản chúng kế thừa giá trị của chúng từ các phần tử cha trong cây wpf (hợp lý/hình ảnh). Thuộc tính phụ thuộc (được đính kèm hoặc không) kế thừa giá trị của nó "hướng xuống" nếu số metadata được đặt bằng FrameworkPropertyMetadataOptions. Thừa kế cờ và trong nhiều trường hợp, điều này là như vậy.
Thuộc tính được đính kèm là các thuộc tính có thể được đặt trên bất kỳ đối tượng wpf nào (về cơ bản, ít nhất một DependencyObject) thông qua phương thức DependencyObject.SetValue. Mục đích của cơ chế này là "đính kèm" vào các đối tượng khác thông tin cần thiết bởi các đối tượng cha mẹ, không phải chính các đối tượng con. Ví dụ, Grid.Row là thuộc tính đính kèm theo yêu cầu của lưới để đặt các mục trong vùng render của nó.
Thuộc tính phụ thuộc được kế thừa tự động "hướng xuống" bởi hệ thống đối tượng wpf.
Thuộc tính được đính kèm được kiểm tra "trở lên" một cách rõ ràng, trong mã của các đối tượng cụ thể. Trong trường hợp của Grid, khi xác định nơi để đặt các mục của nó, nó sẽ kiểm tra giá trị của Grid.Row và Grid.Column thuộc tính đính kèm trên mỗi mục chứa.
Nó cũng thường là kỹ thuật tạo thuộc tính được đính kèm tùy chỉnh mà sửa đổi theo cách nào đó mà các đối tượng được gắn vào (ví dụ: Drag'n'Drop functionality via attached properties).
Là một lưu ý bổ sung, ví dụ hay về thuộc tính được kế thừa đính kèm là TextElement.FontFamily. Thuộc tính Grid.Row và Grid.Column không có bộ cờ Inherits.
TextElement.FontFamily, từ Reflector:
FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));
Grid.Row, từ Reflector:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
Thú vị và mang tính thông tin. Điều gì về kịch bản này, mặc dù: Một lưới 2x2 (A) chứa một lưới 2x2 (B). Lưới B chứa một Nút. Nếu Grid B có Grid của nó.Thuộc tính Cột đính kèm được đặt thành 1 (vì vậy nó xuất hiện trong cột thứ hai của lưới cha của nó, Lưới A), không nên Thuộc tính đính kèm xếp xuống dưới nút Lưới B, do đó nút xuất hiện trong cột thứ hai của lưới B? – Pwninstein
Câu hỏi hay, thêm thông tin vào câu trả lời. –
Tuyệt vời! Làm cho nhiều ý nghĩa hơn bây giờ, cảm ơn !! – Pwninstein