DataTemplateSelector.SelectTemplate(Object, DependencyObject) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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 myTaskTemplate
importantTaskTemplate
.
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.