這兩者之間的區別是什麼時候應該使用RegisterAttached()而不是.Register()?DependencyProperty.Register()或.RegisterAttached()
回答
我假設你的意思是DependencyProperty.Register和DependencyProperty.RegisterAttached。
DependencyProperty.Register用於註冊正常的DependencyProperty。你可以看到那些只是普通的屬性,加入了他們可以參與WPF的DataBinding,動畫等的部分。 事實上,它們在無類型的DependencyObject的頂部作爲普通屬性(使用get和set訪問器)公開。 SetValue/GetValue。 你聲明那些是你的類型的一部分。
另一方面,附加屬性是不同的。它們被認爲是一個可擴展性系統。如果您曾經在Windows Forms中使用Extender,它們有點類似。 您將它們聲明爲類型的一部分,以用於其他類型。
他們用於佈局相關的信息很多。例如,Canvas需要Left/Top座標,Grid需要一個Row和一個Column,DockPanel需要一個Dock信息等。如果必須在每個可以進行佈局的控件上聲明所有這些,這將是一團糟。因此它們在相應的面板上聲明,但在任何控件上使用。
如果需要,您可以使用相同的方法將任何信息附加到DependencyObject。例如,它可以派上用場,只需聲明一段可以在xaml中設置的信息,以便稍後用於現有類的樣式。
因此,這兩種DependencyProperty服務於一個非常不同的目的。常規屬性(通過Register()註冊)與普通屬性一樣用作類型接口的一部分。附加屬性(通過RegisterAttached()註冊)用作現有類的可擴展性點。
希望能夠澄清一點。
你的意思是DependencyProperty.Register()和DependencyProperty.RegisterAttached(),偶然嗎? MSDN不列出DependencyProperty.Attach()或DependencyProperty.AttachRegistered()。
DependencyProperty.Register()和DependencyProperty.RegisterAttached()之間的區別在於.Register()用於在DependencyObject上註冊'regular'依賴項屬性,而.RegisterAttached()用於設置'attached '依賴屬性。
兩種類型的依賴項屬性之間的區別是相當直接的:常規依賴項屬性在特定的DependencyObject上設置,就像其他任何.NET屬性一樣。另一方面,附加屬性與特定的DependencyObject(例如Grid)相關聯,但是設置在完全獨立的DependencyObject上,通常是定義附屬屬性的DependencyObject子節點(例如Grid.Row,附屬屬性,設置對一個父級網格的孩子)。
有關附加屬性的更多細節are on MSDN。
使用SetValue和GetValue可以將註冊Register或RegisterAttached的屬性附加到任何DependencyObject。但是,如果將使用Register註冊的屬性附加到ownerType以外的對象,則不會使用其元數據(默認值除外)。這意味着諸如Inherits或AffectsMeasure之類的屬性不適用於這些屬性。如果您對附加屬性的元數據感興趣,則應該使用RegisterAttached。
有關詳細信息,請參閱我的回答類似的問題:Difference between Attached and non-Attached Dependency Properties in Silverlight
- 1. DependencyProperty.Register()的用法?
- 2. 尋找DependencyProperty.Register快捷
- 3. XAML中的DependencyProperty.Register文本框
- 4. 用戶控件DependencyProperty.Register ERROR
- 5. DependencyProperty的RegisterAttached()和Register()中的不同行爲
- 6. RegisterAttached字符串屬性名造成AttachedProperty不火
- 7. 爲什麼我無法將ToggleButton.IsChecked屬性附加到擴展器
- 8. Utf8_general_ci或utf8mb4或...?
- 9. SplitString或SubString或?
- 10. Android - progressbar或seekbar或?
- 11. 指標以$或$或
- 12. setTimeout或setInterval或requestAnimationFrame
- 13. Spring或CDI或EJB3
- 14. PredicateBuilder和或或者
- 15. MVC4 ViewBag或ViewModel或?
- 16. Storm:Nginx或Maven或Zookeeper
- 17. addMouseListener或addActionListener或JButton?
- 18. NHibernate或FluentNHibernate或ActiveRecord?
- 19. IIS上的Django:PyISAPIe或FastCGI或WSGI或Helicon Zoo或DjangoWindowsTools
- 20. 或
- 21. Laravel 5查詢「where(a或b或c)和(d或e或f)和...(x或y或z)」
- 22. 使用document.location.href或window.location或window.location.href
- 23. 邏輯或和按位或
- 24. SQLite或coredata或其他
- 25. MongoDB或CouchDB或其他?
- 26. RoboSpice或改造或排球?
- 27. 比較UIColors或CGColor或CGColorSpace
- 28. 與CSS或jQuery的或許
- 29. <jsp:include或<@include或Tiles
- 30. .Match()A或B或C
所以連接可以用來添加屬性,你沒有自己的班?這是區別嗎? – Vaccano
非常感謝你! –
你可以設置依賴屬性,它不是附加在其他對象上的屬性:'this.button.SetValue(TextBox.TextProperty,「text」);'(其中'this.button'的類型是'System。 Windows.Controls.Button')。這非常好,所以答案並不完整。必須有更多。 – bitbonk