WPF 数据模板 (三) 数据模板选择器

WPF 数据模板 (三) 数据模板选择器  

前言

最近项目需要动态根据属性动态选择数据模板,研究了一下写了一个数据据模板选择器 分享一下。

 

首先了解一下 DataTemplateSelector:

System.Windows.Controls.DataTemplateSelector :提供一种方式,用于根据数据对象和数据绑定元素来选择 System.Windows.DataTemplate.

OK 废话不多说,直接开始编码。

首先创建ConditionalDataTemplateRule 类 ,该类包含一个 标志值 和 对应的数据模板对象:

 public class ConditionalDataTemplateRule
    {
        public object Value { get; set; }

        public DataTemplate DataTemplate { get; set; }
    }

然后创建一个继承于DataTemplateSelector的ConditionalDataTemplateSelector 类 :

  public class ConditionalDataTemplateSelector:DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            object conditionValue = this.ConditionConverter.Convert(item,null,null,null);
            foreach(ConditionalDataTemplateRule rule in this.Rules)
            {
                if(Equals(rule.Value,conditionValue))
                {
                    return rule.DataTemplate;
                }
            }
            return base.SelectTemplate(item, container);
        }

        List<ConditionalDataTemplateRule> _rules;

        public List<ConditionalDataTemplateRule> Rules
        {
            get { return this._rules ?? (this._rules = new List<ConditionalDataTemplateRule>()); }
        }

        public IValueConverter ConditionConverter { get; set; }
    }

在前端定义一个ConditionalDataTemplateSelector  数据模板转换器对象,并向里面添加规则:

 <DataTemplate x:Key="Template1">
        
    </DataTemplate>
    
    <DataTemplate x:Key="Template2">

    </DataTemplate>
    
    <selector:ConditionalDataTemplateSelector x:Key="Selector" ConditionConverter="{StaticResource TemplateConverter}">
        <selector:ConditionalDataTemplateSelector.Rules>
            <selector:ConditionalDataTemplateRule DataTemplate="{StaticResource Template1}">
                <sys:String>Template1</sys:String>
            </selector:ConditionalDataTemplateRule>
        </selector:ConditionalDataTemplateSelector.Rules>
        <selector:ConditionalDataTemplateSelector.Rules>
            <selector:ConditionalDataTemplateRule DataTemplate="{StaticResource Template2}">
                <sys:String>Template2</sys:String>
            </selector:ConditionalDataTemplateRule>
        </selector:ConditionalDataTemplateSelector.Rules>
    </selector:ConditionalDataTemplateSelector>

创建一个转换器:TemplateConverter:

  public class TemplateConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return GetValue(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        string GetValue(object value)
        {
            var obj = value as string;

            var val = "Template1";
            if (obj == null)
                return val;

            if (obj.ToString().Equals("Template2"))
                val = "Template2";
            else if (obj.ToString().Equals("Template3"))
                val = "Template3";
            return val;
        }
    }

最后应用:

 <DataGrid x:Key="test">
        <DataGrid.Columns>
            <DataGridTemplateColumn CellTemplateSelector="{StaticResource Selector}" />
        </DataGrid.Columns>
    </DataGrid>

由于时间仓促,写的相对简单,暂时到这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值