Поделиться через


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

Комментарии

Как правило, создается DataTemplateSelector при наличии нескольких DataTemplate объектов одного типа и вы хотите предоставить собственную логику для DataTemplate применения на основе свойств каждого объекта данных. Обратите внимание, что если у вас есть объекты разных типов, можно задать DataType свойство в .DataTemplate Если это сделать, то не нужно создавать DataTemplateSelector. Кроме того, если у вас есть объекты одного типа, но с разными свойствами, можно также рассмотреть возможность использования DataTrigger преобразователя данных или преобразователя данных. Дополнительные сведения см. в разделе "Общие сведения о шаблоне данных".

Чтобы создать селектор шаблона, создайте класс, который наследует от DataTemplateSelector метода и переопределит его SelectTemplate . После определения класса можно назначить экземпляр класса свойству селектора шаблона элемента.

Если заданы ContentTemplateSelector оба свойства, ContentTemplate то это свойство игнорируется.

Использование атрибута XAML

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

Значения XAML

ResourceExtension Расширение разметки, определяющее, как ссылаться на ресурс шаблона либо StaticResourceDynamicResource. См. статью "Ресурсы XAML".

TemplateSelectorKey Ключ, определяющий запрошенный селектор шаблона. Ключ ссылается на существующий ресурс в объекте ResourceDictionary.

Сведения о свойстве зависимостей

Элемент Ценность
Поле идентификатора ContentTemplateSelectorProperty
Свойства метаданных, равные свойству true Нет

Применяется к