我查看了各种示例并阅读了附加属性。然而,我仍然不清楚为什么他们需要或更好。看看这个例子:
<DockPanel>
<CheckBox DockPanel.Dock="Top">Hello</CheckBox>
</DockPanel>
DockPanel.Dock是一个附加属性,很清楚它的意图是什么:不是元素应该具有或需要一个允许它定义其对接行为的单独属性。网格的行和列定义也是如此。但为什么不表达这样的事情呢?
<DockPanel>
<Docked Location="Top">
<CheckBox>Hello</CheckBox>
</Docked>
</DockPanel>
对于带有行标签和列标签的网格,也可以使用类似的功能。
这是一个纯粹的设计决策,还是有其他原因使附加属性更好或唯一的解决方案?
答案 0 :(得分:2)
您的示例可能只适用于一个案例,甚至经常使用,但您不应该只依赖一个附加属性。
例如,假设您希望标记的不仅仅是一个附加属性,如下所示:
<DockPanel>
<CheckBox DockPanel.Dock="Top" TextBlock.FontSize="16">Hello</CheckBox>
</DockPanel>
等效的&#34;封装的#34;方式是什么?
我自己会添加另一个观点,尽管只是我的。 XAML表示法通常表示对象结构:元素表示类(实例),而属性表示属性。您的模式将违反设置属性的能力,如下所示:
<DockPanel>
<DockPanel.RenderTransform>
<ScaleTransform ScaleX="2" ScaleY=3" />
</DockPanel.RenderTransform>
</DockPanel>
这是一种特殊的元素模式,它表示定义属性(例如RenderTransform)内容(即实际变换实例)的替代方法。
更新:我还要添加另一个关于应该插入什么作为某个容器(在您的示例中为DockPanel)的子项的内容。 &#34;停靠&#34;应该是一个真正的孩子,还是只是一个不属于视觉/逻辑树的虚拟容器?那么,假设你走在视觉/逻辑树上,你是否应该找到这个元素?如果没有,你应该以哪种方式获得&#34; Docked&#34;值?
现在,我不确定我的答案是否令你满意,但是......随意指明你在附加属性模式中不喜欢的内容,也许你会达到这一点!