如何使用ItemTemplateSelector

WPF 的 ItemsControl 数据绑定中,有时会遇到绑定的数据源是多种类型,并且需要对不同类型使用不同的模板。这个时候就需要用到 ItemTemplateSelector。

ItemTemplateSelector 的定义

ItemTemplateSelector 是 DataTemplateSelector 类型,通常需要定义一个类继承 DataTemplateSelector。

注意,下面代码关键之处在于定义了 DataTemplate 类型的属性,并在 XAML 中设置其值,避免寻找资源。

public class ValueEditorTemplateSelector : DataTemplateSelector
{
	public DataTemplate StandardTemplate
	{
		get { return this.standardTemplate; }
		set { this.standardTemplate = value; }
	}

	public DataTemplate EnumTemplate
	{
		get { return this.enumTemplate; }
		set { this.enumTemplate = value; }
	}

	public override DataTemplate SelectTemplate(object item, DependencyObject container)
	{
		PropertyInformation property = (PropertyInformation)item;

		if (property.PropertyType.IsEnum)
			return EnumTemplate;
		return StandardTemplate;
	}
}

ItemTemplateSelector 的使用

<my:ValueEditorTemplateSelector x:Key="EditorSelector">
    <my:ValueEditorTemplateSelector.StandardTemplate>
        <DataTemplate>
            <DockPanel>
                <editors:MouseWheelValueEditor/>
                <my:StandardValueEditor
                    PropertyType="{Binding PropertyType}"
                    Value="{Binding Value, Mode=TwoWay}"
                    DescriptiveValue="{Binding DescriptiveValue, Mode=OneWay}"
                    IsSelected="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}"
                    IsEditable="{Binding CanEdit}"
                    PropertyInfo="{Binding}"/>
                <Border/>
            </DockPanel>
        </DataTemplate>
    </my:ValueEditorTemplateSelector.StandardTemplate>

    <my:ValueEditorTemplateSelector.EnumTemplate>
        <DataTemplate>
            <DockPanel>
                <editors:MouseWheelValueEditor/>
                <my:EnumValueEditor
                    PropertyType="{Binding PropertyType}"
                    Value="{Binding Value, Mode=TwoWay}"
                    DescriptiveValue="{Binding DescriptiveValue, Mode=OneWay}"
                    IsSelected="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}"
                    IsEditable="{Binding CanEdit}"
                    PropertyInfo="{Binding}"/>
                <Border/>
            </DockPanel>
        </DataTemplate>
    </my:ValueEditorTemplateSelector.EnumTemplate>
</my:ValueEditorTemplateSelector>
时间: 2024-10-24 16:35:21

如何使用ItemTemplateSelector的相关文章

WPF Telerik TreeListView样式设计

Telerik控件 TreeListView 修改其中样式 1.添加TreeListView控件 <telerik:RadTreeView x:Name="ObjecTreeView" Padding="0,5,0.5,5" Grid.Row="1" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" te

Simple Style

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/interactivedesigner/2006" xmlns:

WPF 常用样式

TextBox <Window x:Class="WpfDemo.ListBoxTemaple" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ListBoxTemaple" Height="300&qu

UWP开发入门(十八)——使用ContentControl减少页面元素数量

我们今天学习一下ContentControl,主要介绍如何使用ContentControl搭配DataTemplate来进行界面的复用,以及通过ContentTemplateSelector进一步减少页面元素数量,提高性能. 假设我们的UWP APP为左右分开两列,左边为ListView显示集合,右边为ListView中选中项的明细页面.左侧ListView会列出每一项的Avatar,共分三种:1.有图像的显示图像.2.没图像有名字显示首字母,3.图像名字都没有,显示两个圈圈.同时在ListVi

wpf 模板选择器DataTemplateSelector及动态绑定,DataTemplate.Triggers触发器的使用

通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelector.请注意,如果具有不同类型的对象,则可以对 DataTemplate 设置 DataType 属性.如果您执行了此操作,则无需创建 DataTemplateSelector.此外,如果对象类型相同但属性不同,也可以考虑使用 DataTrigger 或数据转换器. 通俗讲,就是根据不同的数据选择不

【转】AutoSuggestBox--UWP控件

原文点这里>> 摘要 要开发一款优秀的application,控件肯定是必不可少的,uwp就为开发者提供了各种各样的系统控件,AutoSuggestBox就是uwp极具特色的控件之一,也是相对于之前win8.1的uap较新的控件,今天我们就来谈谈AutoSuggestBox的基本用法及其自定义UI方法. A Simplest Sample 话不多说,先来个小Demo. <!-- MainPage.xaml --> <Page x:Class="AutoSuggest

WPF核心对象模型-类图和解析

DispatcherObject是根基类,通过继承该类,可以得到访问创建该对象的UI线程的Dispatcher对象的能力.通过Dispatcher对象,可以将代码段合并入该UI线程执行. DependencyObject是核心基类,用于实现依赖属性机制.依赖属性是一个比CLR属性更强大的属性模型,该模型支持更改通知,默认值继承等特性,并能减少属性存储空间.DependencyObject通过GetValue和SetValue等方法支持依赖属性机制.继承该类的几个下一层基类Visual,Visua

wpf ComboBox 样式修改

<Window x:Class="ComboBoxStyle.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width=

背水一战 Windows 10 (51) - 控件(集合类): ItemsControl - 项模板选择器, 数据分组

原文:背水一战 Windows 10 (51) - 控件(集合类): ItemsControl - 项模板选择器, 数据分组 [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类 - ItemsControl) 项模板选择器 数据分组 示例1.ItemsControl 的项模板选择器Controls/CollectionControl/ItemsControlDemo/ItemsControlDemo3.xaml <Page x:Class="Windo