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 метод . Определив класс, можно назначить экземпляр класса свойству селектора шаблона элемента.

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