DataTemplateSelector.SelectTemplate(Object, DependencyObject) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
При переопределении в производном классе возвращает DataTemplate на основе пользовательской логики.
public:
virtual System::Windows::DataTemplate ^ SelectTemplate(System::Object ^ item, System::Windows::DependencyObject ^ container);
public virtual System.Windows.DataTemplate SelectTemplate (object item, System.Windows.DependencyObject container);
abstract member SelectTemplate : obj * System.Windows.DependencyObject -> System.Windows.DataTemplate
override this.SelectTemplate : obj * System.Windows.DependencyObject -> System.Windows.DataTemplate
Public Overridable Function SelectTemplate (item As Object, container As DependencyObject) As DataTemplate
Параметры
- item
- Object
Объект данных, для которого можно выбрать шаблон.
- container
- DependencyObject
Объект с привязкой к данным.
Возвращаемое значение
Возвращает DataTemplate или null
. Значение по умолчанию — null
.
Примеры
В этом примере источником привязки является список Task
объектов . Одно из свойств Task
объекта — Priority
. Определены два шаблона данных: myTaskTemplate
и importantTaskTemplate
.
Чтобы задать логику для выбора того, какой DataTemplate использовать в зависимости от значения Priority
объекта данных, создайте подкласс DataTemplateSelector и переопределите метод SelectTemplate. В следующем примере метод SelectTemplate предоставляет логику для возвращения соответствующего шаблона на основе значения свойства Priority
. Возвращаемый шаблон находится в ресурсах запечатывающего элемента Window.
using System.Windows;
using System.Windows.Controls;
namespace SDKSample
{
public class TaskListDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is Task)
{
Task taskitem = item as Task;
if (taskitem.Priority == 1)
return
element.FindResource("importantTaskTemplate") as DataTemplate;
else
return
element.FindResource("myTaskTemplate") as DataTemplate;
}
return null;
}
}
}
Namespace SDKSample
Public Class TaskListDataTemplateSelector
Inherits DataTemplateSelector
Public Overrides Function SelectTemplate(ByVal item As Object, ByVal container As DependencyObject) As DataTemplate
Dim element As FrameworkElement
element = TryCast(container, FrameworkElement)
If element IsNot Nothing AndAlso item IsNot Nothing AndAlso TypeOf item Is Task Then
Dim taskitem As Task = TryCast(item, Task)
If taskitem.Priority = 1 Then
Return TryCast(element.FindResource("importantTaskTemplate"), DataTemplate)
Else
Return TryCast(element.FindResource("myTaskTemplate"), DataTemplate)
End If
End If
Return Nothing
End Function
End Class
End Namespace
Затем можно объявить TaskListDataTemplateSelector
как ресурс:
<Window.Resources>
<local:TaskListDataTemplateSelector x:Key="myDataTemplateSelector"/>
</Window.Resources>
Чтобы использовать ресурс селектора шаблонов, присвойте его свойству ItemTemplateSelectorListBox.
ListBox Вызывает метод SelectTemplateTaskListDataTemplateSelector
для каждого элемента в базовой коллекции. Вызов передает объект данных в качестве параметра элемента. Затем шаблон DataTemplate, возвращенный этим методом, применяется к этому объекту данных.
<ListBox Width="400" Margin="10"
ItemsSource="{Binding Source={StaticResource myTodoList}}"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}"
HorizontalContentAlignment="Stretch"/>
Полный пример см. в разделе Вводная часть примера стилизации и использования шаблонов.
Комментарии
Как правило, селектор шаблонов используется при наличии нескольких шаблонов данных, определенных для одного типа объектов. Например, если источником привязки является список объектов учащихся, и вы хотите применить определенный шаблон к учащимся с неполным временем. Это можно сделать, создав класс, который наследует от DataTemplateSelector и переопределить SelectTemplate метод . Определив класс, можно назначить экземпляр класса свойству селектора шаблона элемента.