Подтвердить что ты не робот

Как я могу определить привязку DataTemplate в WPF?

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

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

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

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

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

Предложения?

4b9b3361

Ответ 1

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

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

Ответ 2

Создайте UserControl и используйте его в DataTemplate.

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

и внутри UserControl:

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

У вас есть отдельный DataTemplate со своей привязкой для каждого случая.