Как я могу выделить привязку DataTemplate в WPF? - PullRequest
12 голосов
/ 17 июня 2009

У меня есть DataTemplate Я хочу использовать повторно. Часть, которую я хочу выделить, - это связывание, потому что это единственное, что меняется. Мой DataTemplate выглядит примерно так. (На самом деле это немного больше, но я убрал посторонние вещи.)

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

Как я могу использовать это DataTemplate, просто меняя свойство, к которому я привязан? (Обратите внимание, что если бы это было так просто, как TextBox, я бы об этом не беспокоился, но на самом деле DataTemplate содержит StackPane l с рядом других элементов. Я хочу централизовать это в одно место, отсюда DataTemplate.)

Я думал о двух способах решения этой проблемы.

  1. Создать простой пользовательский элемент управления. Используйте это снова и не беспокойтесь о повторном использовании DataTemplate.
  2. Поэкспериментируйте с каким-то подклассом DataTemplate. (Мне сказали, что это возможно.) Я бы добавил к нему свойство зависимости, которое позволит мне указать имя свойства, к которому я хочу привязать.

Предложения

Ответы [ 2 ]

4 голосов
/ 17 июня 2009

Ненавижу отвечать на свои вопросы, но ради полноты вот мое решение.

<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, где каждый столбец может отображаться аналогичным образом, но привязывается к другому свойству.

0 голосов
/ 17 июня 2009

Создайте UserControl и используйте его в шаблоне данных.

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

и в пользовательском контроле:

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

Иметь отдельный шаблон данных с собственной привязкой для каждого случая.

...