WPF: Как настроить триггер шаблона данных для управления контентом? - PullRequest
33 голосов
/ 24 апреля 2011

Я хочу создать пользовательский элемент управления, содержащий одно поле со списком и элемент управления содержимым.Выбор, сделанный в поле со списком, должен определить шаблон данных, который будет использовать элемент управления содержимым.Я прочитал эту статью , которая в значительной степени демонстрирует то, чего я пытаюсь достичь.

Поле со списком заполнено значениями enum ModelType, которые могут быть Person или Company.Если пользователь выбирает Person, элемент управления контентом должен использовать шаблон данных personTemplatecompanyTemplate для Company.

Я застрял с кодом XAML для управления контентом.Вот что я создал, но не могу заставить его работать:

<UserControl.Resources>
  ...
  <DataTemplate x:Key="personTemplate" ...>
  <DataTemplate x:Key="companyTemplate" ...>
  ...
</UserControl.Resources>
...
<ContentControl x:Name="Account">
  <ContentControl.ContentTemplate>
    <DataTemplate>
      <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding AccountType}" Value="Person">
        <!-- I doubt the Value property is set correctly. -->
        <!-- It should be a value of an enum ModelType -->
          <Setter 
              TargetName="Account" 
              Property="ContentTemplate" 
              Value="{StaticResource personTemplate}" />
          <!-- The setter is unaware of the target name, i.e. content control -->
        </DataTrigger>
        <DataTrigger Binding="{Binding AccountType}" Value="Company">
          <Setter 
              TargetName="Account" 
              Property="ContentTemplate" 
              Value="{StaticResource companyTemplate}" />
        </DataTrigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </ContentControl.ContentTemplate>                    
</ContentControl>

Пожалуйста, помогите, спасибо.

1 Ответ

83 голосов
/ 24 апреля 2011

Я действительно заставил это работать. :)

Вот как должен выглядеть XAML:

<ContentControl Content="{Binding}">
  <ContentControl.Style>
    <Style TargetType="ContentControl">
      <Style.Triggers>
        <DataTrigger Binding="{Binding AccountType}" Value="Person">
          <Setter Property="ContentTemplate" Value="{StaticResource personTemplate}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding AccountType}" Value="Company">
          <Setter Property="ContentTemplate" Value="{StaticResource companyTemplate}" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ContentControl.Style>
</ContentControl>

Значения перечисления также работают хорошо. Я надеюсь, что это помогает некоторым нуждающимся людям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...