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. В этом примере выбранный элемент в ComboBox привязывается к свойству LabelContent , которое наследуется от 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
Расширение разметки, определяющее, как ссылаться на ресурс шаблона, StaticResource
или DynamicResource
. См . раздел Ресурсы XAML.
TemplateSelectorKey
Ключ, определяющий запрошенный селектор шаблона. Ключ ссылается на существующий ресурс в ResourceDictionary.
Сведения о свойстве зависимостей
Поле идентификатора | ContentTemplateSelectorProperty |
Для свойств метаданных задано значение true |
Нет |