Language

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 オブジェクトのプロパティの 1 つがPriority。 myTaskTemplateとimportantTaskTemplateの 2 つのデータ テンプレートが定義されています。

データ オブジェクトの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>

テンプレート セレクター リソースを使用するには、ItemTemplateSelectorの ListBox プロパティに割り当てます。 ListBoxは、基になるコレクション内の各項目のSelectTemplateのTaskListDataTemplateSelector メソッドを呼び出します。 呼び出しは、項目パラメーターとしてデータ オブジェクトを渡します。 メソッドによって返される DataTemplate は、そのデータ オブジェクトに適用されます。

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

完全なサンプルについては、「 データ テンプレートサンプルの概要」を参照してください。

注釈

通常、同じ種類のオブジェクトに対して複数のデータ テンプレートが定義されている場合は、テンプレート セレクターを使用します。 たとえば、バインド ソースが学生オブジェクトの一覧であり、特定のテンプレートをパートタイムの学生に適用する場合です。 これを行うには、 DataTemplateSelector から継承するクラスを作成し、 SelectTemplate メソッドをオーバーライドします。 クラスが定義されたら、クラスのインスタンスを要素のテンプレート セレクター プロパティに割り当てることができます。

適用対象