小弟遇到一个问题“如何动态创建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 >
网上许多例子都是动态创建模板列,而没有解决模板列根据内容动态创建控件的问题,希望对大家有所帮助。