DataTemplateSelector.SelectTemplate(Object, DependencyObject) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在衍生類別中覆寫時,根據自訂邏輯傳回 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
屬性是 Priority
。 已定義兩個資料範本和 myTaskTemplate
importantTaskTemplate
。
若要提供邏輯來選擇要 DataTemplate 根據 Priority
資料物件值使用的邏輯,請建立 的 DataTemplateSelector 子類別並覆寫 SelectTemplate 方法。 在下列範例中,方法會 SelectTemplate 根據 屬性的值,提供傳回適當範本的 Priority
邏輯。 在 enveloping 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 類別來執行此動作。 定義類別之後,您可以將 類別的實例指派給元素的範本選取器屬性。