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

DataTemplate または null 値を返します。 既定値は null です。

この例では、バインディング ソースはオブジェクトの Task 一覧です。 オブジェクトのプロパティの Task 1 つは Priority. 2 つのデータ テンプレートが定義されており、myTaskTemplate.importantTaskTemplate

データ オブジェクトの Priority の値に基づいて使用する DataTemplate を選択するロジックを提供するには、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>

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

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

完全なサンプルについては、「Introduction to Data Templating Sample」(データ テンプレート サンプルの概要) をご覧ください。

注釈

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

適用対象