为什么WPF使用附加属性来定位网格中的位置?

J C*_*per 3 wpf xaml design-decisions attached-properties

为什么我们需要"附加属性"?它的概念让我有点烦恼,因为你可以想象设置特定DependencyObject上甚至不存在的属性值(并且它们将被默默地忽略).它几乎看起来像是一个寻找问题的解决方案 - 为什么不只是像HTML那样做,并让父元素明确地确定儿童定位等事情?

也就是说,而不是:

<Grid>
  <Grid.ColumnDefinitions>
    <!-- etc. -->
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <!-- etc. -->
  </Grid.RowDefinitions>
  <SomeElement Grid.Column="0" Grid.Row="0" />
  <!-- etc. -->
</Grid>
Run Code Online (Sandbox Code Playgroud)

为什么不是这样的(相当于<tr><td>在HTML中):

<Grid>
  <Grid.Row>
    <Grid.Column>
      <SomeElement />
    </Grid.Column>
    <!-- etc. -->
  </Grid.Row>
</Grid>
Run Code Online (Sandbox Code Playgroud)

也许网格只是一个不好的例子,附加属性在其他环境中更有意义?或许我完全错过了一些东西?

Rob*_*ney 6

您需要附加属性来定位网格中元素的最明显原因是您可以使用绑定:

<Grid.ItemContainerStyle>
   <Style TargetType="ContentPresenter">
      <Setter Property="Grid.Row" Value="{Binding Row}"/>
      <Setter Property="Grid.Column" Value="{Binding Column}"/>
   </Style>
</Grid.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)

要在HTML中实现类似的功能,您必须编写代码,以便在行和/或列号更改时显式删除和重新添加元素.