12

DataTemplate再利用したいものがあります。除外したい部分はバインディングです。変更されるのはバインディングだけだからです。私DataTemplateの見た目は大体こんな感じです。(実際にはもっとたくさんありますが、余分なものを取り除いています。)

<DataTemplate>
    <TextBox Text="{Binding Name}" />
</DataTemplate>

DataTemplateバインドしているプロパティを変更するだけでこれを再利用するにはどうすればよいですか? ( a のように単純な場合TextBoxは気にしませんが、DataTemplate実際にはStackPanel に他の多くの要素が含まれていることに注意してください。それを 1 か所に集中させたいので、DataTemplate.)

この問題に取り組むために、私は 2 つの方法を考えました。

  1. 簡単なカスタム コントロールを作成します。それを再利用し、再利用について心配する必要はありませんDataTemplate
  2. DataTemplate のある種のサブクラスを試してみてください。(これは可能だと言われています。) 依存関係プロパティを追加して、バインドするプロパティの名前を指定できるようにします。

提案?

4

2 に答える 2

4

私は自分の質問に答えるのが嫌いですが、完全を期すために、ここに私の解決策があります.

<ListBox ItemsSource="{Binding}">
  <ListBox.Resources>
    <ControlTemplate x:Key="textBoxControlTemplate" TargetType="ContentControl">
      <TextBox Text="{TemplateBinding Content}" /> 
    </ControlTemplate>
  </ListBox.Resources>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <ContentControl Content="{Binding Name}" Template="{StaticResource textBoxControlTemplate}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

もちろん、これは非常に不自然な例です。私自身のアプリでは、実際にはリストボックス内にテキストボックスを配置していません。リストボックスでは、これはあまり役に立ちませんが、各列が同様の方法で表示され、異なるプロパティにバインドされる DataGrid 内を想像してみてください。

于 2009-06-16T22:44:19.283 に答える
0

UserControl を作成し、DataTemplate 内で使用します。

<DataTemplate>
    <local:MyComplexUserControl DataContext="{Binding Name}"/>
</DataTemplate>

そしてUserControl内:

<StackPanel>
  <TextBlock>Value:</Text>
  <TextBox Text="{Binding}"/>
</StackPanel>

それぞれの場合に独自のバインドを持つ個別の DataTemplate を用意します。

于 2009-06-17T01:01:10.520 に答える