Silverlight DataGrid 模板列根据内容动态生成控件
小弟遇到一个问题“如何动态创建Silverlight DataGrid模板列,并且模板列每行的控件有可能不一样?”,在园子里找了半天,也没找到答案,但幸运的是在http://social.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/8e44d306-a68b-4ee7-a82f-68a12e82c7e4找到了答案,现附上代码,希望对大家有所帮助。
1、创建抽象类DataTemplateSelector,继承自内容控件ContentControl
public abstract class DataTemplateSelector : ContentControl
{
public virtual DataTemplate SelectTemplate(object item,DependencyObject container)
{
return null;
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
ContentTemplate = SelectTemplate(newContent, this);
}
}
2、创建PersonTemplateSelector,继承自DataTemplateSelector,根据内容动态选择TextBoxTemplate或DatePickerTemplate
{
public DataTemplate TextBoxTemplate
{
get;
set;
}
public DataTemplate DatePickerTemplate
{
get;
set;
}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Model_PersonDataSet mp = item as Model_PersonDataSet;
if (mp.DataType == "D" || mp.DataType == "DT")
{
return DatePickerTemplate;
}
else
{
return TextBoxTemplate;
}
return base.SelectTemplate(item, container);
}
}
3、附上前台XAML代码
<my1:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:PersonTemplateSelector Content="{Binding}">
<local:PersonTemplateSelector.TextBoxTemplate>
<DataTemplate>
<TextBox Text="{Binding DEValue,Mode=TwoWay}" HorizontalAlignment="Stretch"></TextBox>
</DataTemplate>
</local:PersonTemplateSelector.TextBoxTemplate>
<local:PersonTemplateSelector.DatePickerTemplate>
<DataTemplate>
<my1:DatePicker SelectedDate="{Binding DEValue,Mode=TwoWay}" SelectedDateFormat="Long" />
</DataTemplate>
</local:PersonTemplateSelector.DatePickerTemplate>
</local:PersonTemplateSelector>
</DataTemplate>
</my1:DataGridTemplateColumn.CellTemplate>
</my1:DataGridTemplateColumn>
网上许多例子都是动态创建模板列,而没有解决模板列根据内容动态创建控件的问题,希望对大家有所帮助。

浙公网安备 33010602011771号