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
。
若要提供逻辑以根据Priority
数据对象的值选择DataTemplate要使用的逻辑,请创建一个子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资源的属性。 SelectTemplate调用ListBox基础集合中每个项的方法TaskListDataTemplateSelector
。 该调用会将数据对象作为项参数传递。 DataTemplate然后,该方法返回的方法将应用于该数据对象。
<ListBox Width="400" Margin="10"
ItemsSource="{Binding Source={StaticResource myTodoList}}"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}"
HorizontalContentAlignment="Stretch"/>
有关完整示例,请参阅数据模板化示例简介。
注解
通常,如果为相同类型的对象定义了多个数据模板,则使用模板选择器。 例如,如果绑定源列出学生对象列表,并且你想要将特定模板应用于兼职学生。 可以通过创建继承方法 DataTemplateSelector 并重写方法的 SelectTemplate 类来执行此操作。 定义类后,可以将类的实例分配给元素的模板选择器属性。