如何使用ItemTemplateSelector

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用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>

 

以上是关于如何使用ItemTemplateSelector的主要内容,如果未能解决你的问题,请参考以下文章

ItemTemplateSelector

csharp 【执笔中】コレクション内のデータに応じて的DataTemplateを切り替えたい场合にItemTemplateSelectorを使ってみる。

如何使用 Terraform 创建没有代入角色策略的 AWS IAM 角色?

如何提高JVM的性能?

你的店铺适合找代运营吗?如何找到靠谱代运营?

低代码平台如何代客户开发