我想创建一个包含一个组合框和一个内容控件的用户控件。在组合框中所做的选择应确定内容控件将使用的数据模板。我读过this article,几乎可以说明我要实现的目标。

组合框填充了enum ModelType值,可以是PersonCompany。如果用户选择Person,则内容控件应使用personTemplate数据模板;和companyTemplate表示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>

请帮忙,谢谢。

最佳答案

实际上,它可以正常工作。 :)

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>

枚举的值也很好用。我希望这可以帮助一些需要帮助的人。

关于wpf - WPF:如何设置内容控制的数据模板触发器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5771362/

10-10 07:36