DataTemplateSelector.SelectTemplate(Object, DependencyObject) Método

Definición

Si se reemplaza en una clase derivada, devuelve un valor DataTemplate basado en una lógica personalizada.

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

Parámetros

item
Object

El objeto de datos para el que se debe seleccionar la plantilla.

container
DependencyObject

Objeto enlazado a datos.

Devoluciones

Devuelve un valor DataTemplate o null. El valor predeterminado es null.

Ejemplos

En este ejemplo, el origen de enlace es una lista de Task objetos . Una de las propiedades de un Task objeto es Priority. Hay dos plantillas de datos definidas y myTaskTemplateimportantTaskTemplate.

Para proporcionar lógica para elegir qué DataTemplate usar basado en el valor Priority del objeto de datos, cree una subclase de DataTemplateSelector e invalide el método SelectTemplate. En el ejemplo siguiente, el método SelectTemplate proporciona la lógica que devuelve la plantilla adecuada en función del valor de la propiedad Priority. La plantilla que se devuelve se encuentra en los recursos del elemento envolvente 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

Podemos declarar el TaskListDataTemplateSelector como recurso:

<Window.Resources>
<local:TaskListDataTemplateSelector x:Key="myDataTemplateSelector"/>
</Window.Resources>

Para usar el recurso de selector de plantilla, asígnelo a la propiedad ItemTemplateSelector de ListBox. ListBox llama al método SelectTemplate de TaskListDataTemplateSelector para cada uno de los elementos de la colección subyacente. La llamada pasa el objeto de datos como parámetro del elemento. Después, el elemento DataTemplate devuelto por el método se aplica a ese objeto de datos.

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

Para obtener el ejemplo completo, vea Introducción a la aplicación de plantillas de ejemplo.

Comentarios

Normalmente, se usa un selector de plantillas cuando hay más de una plantilla de datos definida para el mismo tipo de objetos. Por ejemplo, si el origen de enlace es una lista de objetos de alumno y desea aplicar una plantilla determinada a los alumnos de tiempo parcial. Para ello, cree una clase que herede de DataTemplateSelector e invalide el SelectTemplate método . Una vez definida la clase, puede asignar una instancia de la clase a la propiedad del selector de plantillas del elemento.

Se aplica a