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>
由于时间仓促,写的相对简单,暂时到这。