ContentControl.ContentTemplateSelector 属性

定义

获取或设置一个模板选择器,以使应用程序编写器能够提供自定义模板选择逻辑。

public:
 property System::Windows::Controls::DataTemplateSelector ^ ContentTemplateSelector { System::Windows::Controls::DataTemplateSelector ^ get(); void set(System::Windows::Controls::DataTemplateSelector ^ value); };
[System.ComponentModel.Bindable(true)]
public System.Windows.Controls.DataTemplateSelector ContentTemplateSelector { get; set; }
[<System.ComponentModel.Bindable(true)>]
member this.ContentTemplateSelector : System.Windows.Controls.DataTemplateSelector with get, set
Public Property ContentTemplateSelector As DataTemplateSelector

属性值

数据模板选择器。 默认值是 null

属性

示例

下面的示例演示如何使用 ContentTemplateSelector 属性。 此示例将 中ComboBoxContent选定的项绑定到 继承自 ContentControlLabel的 属性。 当用户选择低于 5 的值时,所选项的值将显示在 中的黑色方块中 Label。 当用户选择的值为 5 或更高时,该值将以绿色椭圆显示。 该示例通过创建两 DataTemplate 个 对象和 一个 DataTemplateSelector,该对象设置为 ContentTemplateSelector 属性,并根据所选项的值选择合适的 DataTemplate

<Window.Resources>

  <!--Create two DataTemplate objects to be 
  selected by the DataTemplateSelector.-->
  <DataTemplate x:Key="numberTemplate">
    <Grid>
      <Rectangle Stroke="Black" />
      <TextBlock Margin="5" Text="{Binding}" FontSize="18"/>
    </Grid>
  </DataTemplate>

  <DataTemplate x:Key="largeNumberTemplate">
    <Grid>
      <Ellipse Stroke="Green" StrokeThickness="4"/>
      <TextBlock Margin="10" Text="{Binding}" FontSize="24" 
                 Foreground="Red" FontWeight="Bold" />
    </Grid>
  </DataTemplate>

  <local:NumberDataTemplateSelector x:Key="numberTemplateSelector"
                                    NumberTemplate="{StaticResource numberTemplate}"
                                    LargeNumberTemplate="{StaticResource largeNumberTemplate}"/>

</Window.Resources>
<StackPanel>

  <!--Bind the content of the Label to the selected item 
  in the ComboBox.-->
  <Label  Foreground="Black"
          Content="{Binding ElementName=numberList, Path=SelectedItem.Content}"
          ContentTemplateSelector="{StaticResource numberTemplateSelector}">
  </Label>

  <ComboBox Name="numberList">
    <ComboBoxItem>1</ComboBoxItem>
    <ComboBoxItem>2</ComboBoxItem>
    <ComboBoxItem>3</ComboBoxItem>
    <ComboBoxItem>4</ComboBoxItem>
    <ComboBoxItem>5</ComboBoxItem>
    <ComboBoxItem>6</ComboBoxItem>
    <ComboBoxItem IsSelected="True">7</ComboBoxItem>
    <ComboBoxItem>8</ComboBoxItem>
    <ComboBoxItem>9</ComboBoxItem>
    <ComboBoxItem>10</ComboBoxItem>
  </ComboBox>

</StackPanel>
public class NumberDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate NumberTemplate { get; set; }
    public DataTemplate LargeNumberTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        // Null value can be passed by IDE designer
        if (item == null) return null;

        var num = Convert.ToInt32((string)item);
        
        // Select one of the DataTemplate objects, based on the 
        // value of the selected item in the ComboBox.
        if (num < 5)
        {
            return NumberTemplate;
        }
        else
        {
            return LargeNumberTemplate;
        }
    }
}
Public Class NumberDataTemplateSelector
    Inherits DataTemplateSelector

    Public Property NumberTemplate As DataTemplate
    Public Property LargeNumberTemplate As DataTemplate

    Public Overrides Function SelectTemplate(ByVal item As Object, _
                    ByVal container As DependencyObject) As DataTemplate

        ' Nothing can be passed by IDE designer
        if (item Is Nothing) Then
            Return Nothing
        End If

        Dim num = Convert.ToInt32(CStr(item))

        ' Select one of the DataTemplate objects, based on the 
        ' value of the selected item in the ComboBox.
        If num < 5 Then
            Return NumberTemplate

        Else
            Return LargeNumberTemplate
        End If

    End Function 'SelectTemplate
End Class

注解

通常,如果针对同一DataTemplate类型的对象有多个对象,并且想要提供自己的逻辑,以便根据每个数据对象的属性选择要DataTemplate应用的 时,会创建 DataTemplateSelector 。 请注意,如果有不同类型的对象, DataType 则可以在 上 DataTemplate设置 属性。 如果这样做,则无需创建 DataTemplateSelector。 此外,如果对象类型相同,但属性不同,则还可以考虑使用 DataTrigger 或 数据转换器。 有关详细信息,请参阅 数据模板化概述

若要创建模板选择器,请创建继承自 DataTemplateSelector 的类并重写 SelectTemplate 方法。 定义类后,可以将 类的实例分配给元素的模板选择器属性。

如果同时 ContentTemplateSelector 设置了 和 ContentTemplate 属性,则忽略此属性。

XAML 属性用法

<object ContentTemplateSelector="{ResourceExtension TemplateSelectorKey}"/>  

XAML 值

ResourceExtension
一个标记扩展,用于标识如何引用模板资源(或 StaticResourceDynamicResource)。 请参阅 XAML 资源

TemplateSelectorKey
标识所请求的模板选择器的键。 键引用 中的 ResourceDictionary现有资源。

依赖项属性信息

标识符字段 ContentTemplateSelectorProperty
元数据属性设置为 true

适用于