3

なぜ「添付プロパティ」が必要なのですか?特定のDependencyObjectにさえ存在しないプロパティの値を設定できる可能性があるため(そしてそれらは黙って無視されるだけです)、その概念は私を少し悩ませます。問題を探す解決策のように思えます。たとえば、HTMLが行うことを実行し、親要素に子の配置などを明示的に決定させるのはなぜですか。

つまり、次の代わりに:

<Grid>
  <Grid.ColumnDefinitions>
    <!-- etc. -->
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <!-- etc. -->
  </Grid.RowDefinitions>
  <SomeElement Grid.Column="0" Grid.Row="0" />
  <!-- etc. -->
</Grid>

なぜこのようなものではないのですか(HTMLの<tr>およびと同等):<td>

<Grid>
  <Grid.Row>
    <Grid.Column>
      <SomeElement />
    </Grid.Column>
    <!-- etc. -->
  </Grid.Row>
</Grid>

おそらくグリッドは単なる悪い例であり、アタッチされたプロパティは他のコンテキストでより意味がありますか?それとも私は何かを完全に見逃していますか?

4

5 に答える 5

6

グリッド内の要素を配置するためにプロパティをアタッチする必要がある最も明白な理由は、バインディングを使用できるようにするためです。

<Grid.ItemContainerStyle>
   <Style TargetType="ContentPresenter">
      <Setter Property="Grid.Row" Value="{Binding Row}"/>
      <Setter Property="Grid.Column" Value="{Binding Column}"/>
   </Style>
</Grid.ItemContainerStyle>

HTMLに同等の機能を実装するには、行や列の番号が変更されたときに要素を明示的に削除および再追加するコードを作成する必要があります。

于 2011-03-15T16:58:45.673 に答える
2

セルズとグリフィスによるプログラミングWPFからの引用:(私の強調)

明らかな解決策は、プロパティFrameworkElementを定義するなどの基本クラスの場合です。DockすべてのWPFユーザーインターフェイス要素はから派生するFrameworkElementため、これにより、ドックの位置を指定できるようになります。ただし、DockPanelパネルタイプはこれだけではないため、他のパネルのためにもプロパティを追加する必要があります。これにより、多くの混乱が追加されます。さらに悪いことに、柔軟性もありません。新しいレイアウトメカニズムを実装するカスタムパネルを設計する場合はどうでしょうか。子が使用する新しい属性を定義する必要がある場合があります。

添付プロパティはこの問題を解決します。これらを使用すると、1つの要素で、他の要素に「アタッチ」できるプロパティを定義できます。すべての子に適用できるプロパティをDockPanel定義します。DockXAMLでは、点線の属性構文(DockPanel.Dock)は、アタッチされたプロパティが使用されていることを示します

于 2011-03-15T16:48:43.757 に答える
2

実際には答えではありませんが、私は、大きなグリッドを処理する場合、XAMLメソッドはHTMLメソッドよりも読みやすく直感的であると主張します。HTMLテーブルはお尻の痛みになる可能性があります。

于 2011-03-15T16:51:08.683 に答える
2

アイデアは、コントロールがすべての可能なコンテナについて知る必要がないということです。プロパティがアタッチされていない場合は、各タイプのコンテナ( 、、、、、 ...)にUIElement固有のプロパティを公開する必要があります。これにより、システム全体の柔軟性が大幅に低下します。これは、新しいタイプのコンテナーでは、含まれる各コントロールにプロパティを簡単に「追加」できないためです。RowColumnDockTopLeft

于 2011-03-15T17:05:59.170 に答える
0

TextBoxにRowやColumnなどのプロパティがある場合、Panelに直接配置されていないと意味がありません。

したがって、それらは添付プロパティとして実装されます。必要に応じてそれらを「アタッチ」できます。DockPanelのようなパネルにある場合、これらのアタッチされたプロパティは意味があります。そうでない場合は意味がありません。

混乱を解消したいと思います。

于 2011-03-15T17:09:06.960 に答える