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 class PersonTemplateSelector : DataTemplateSelector
    {
        
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 Header="值">
                    
<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>

网上许多例子都是动态创建模板列,而没有解决模板列根据内容动态创建控件的问题,希望对大家有所帮助。

posted @ 2010-08-09 11:51  zjl  阅读(2904)  评论(17)    收藏  举报