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 |
Нет |