DataTemplateSelector.SelectTemplate(Object, DependencyObject) Método

Definição

Quando sobrescrito numa classe derivada, retorna a DataTemplate baseado em 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

O objeto de dados para o qual selecionar o modelo.

container
DependencyObject

O objeto ligado a dados.

Devoluções

Devolve um DataTemplate ou null. O valor predefinido é null.

Exemplos

Neste exemplo, a fonte de ligação é uma lista de Task objetos. Uma das propriedades de um Task objeto é Priority. Existem dois modelos de dados definidos, myTaskTemplate e importantTaskTemplate.

Para fornecer lógica para escolher qual DataTemplate usar com base no valor Priority do objeto de dados, crie uma subclasse de DataTemplateSelector e substitua o método SelectTemplate. No exemplo a seguir, o SelectTemplate método fornece lógica para retornar o modelo apropriado com base no valor da Priority propriedade. O modelo a ser retornado é encontrado nos recursos do 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 então declarar o TaskListDataTemplateSelector como um recurso:

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

Para utilizar o recurso de seletor de modelo, atribua-o à ItemTemplateSelector propriedade do ListBox. O ListBox chama o método SelectTemplate do TaskListDataTemplateSelector para cada item da coleção subjacente. A chamada passa o objeto de dados como parâmetro do item. O DataTemplate que é retornado pelo método é então aplicado a esse objeto de dados.

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

Para obter o exemplo completo, consulte Introdução ao exemplo de modelagem de dados.

Observações

Normalmente, utiliza-se um seletor de modelos quando se tem mais do que um modelo de dados definido para o mesmo tipo de objetos. Por exemplo, se a tua fonte de ligação for listar uma lista de objetos de aluno e quiseres aplicar um modelo específico aos alunos a tempo parcial. Podes fazer isto criando uma classe que herda e DataTemplateSelector sobrepondo o SelectTemplate método. Depois de definida a sua classe, pode atribuir uma instância da classe à propriedade do seletor de templates do seu elemento.

Aplica-se a