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

返回 DataTemplatenull。 默认值是 null

示例

在此示例中,绑定源是对象列表 Task 。 对象的属性之一 TaskPriority。 定义了两个数据模板, myTaskTemplate 以及 importantTaskTemplate

若要提供逻辑以根据Priority数据对象的值选择DataTemplate要使用的逻辑,请创建一个子DataTemplateSelector类并重写SelectTemplate该方法。 在下面的示例中,该方法 SelectTemplate 提供基于属性值返回相应模板的 Priority 逻辑。 要返回的模板位于 enveloping 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资源的属性。 SelectTemplate调用ListBox基础集合中每个项的方法TaskListDataTemplateSelector。 该调用会将数据对象作为项参数传递。 DataTemplate然后,该方法返回的方法将应用于该数据对象。

<ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource myTodoList}}"
         ItemTemplateSelector="{StaticResource myDataTemplateSelector}"
         HorizontalContentAlignment="Stretch"/>

有关完整示例,请参阅数据模板化示例简介

注解

通常,如果为相同类型的对象定义了多个数据模板,则使用模板选择器。 例如,如果绑定源列出学生对象列表,并且你想要将特定模板应用于兼职学生。 可以通过创建继承方法 DataTemplateSelector 并重写方法的 SelectTemplate 类来执行此操作。 定义类后,可以将类的实例分配给元素的模板选择器属性。

适用于