从我在Telerik的GridView控件中使用的,我可以动态地将一列DataGridColumn(忘记了extact类名)添加到GridView中,如果绑定对象是bool那么它将使用CheckBox来显示,否则将使用文本来显示
现在我切换到使用Silverlight的基本DataGrid控件,我想知道我是否可以编写单个类并执行相同的操作?
GridView.Columns.Add(new DataGridColumn(){Binding = new Binding("boolType"), Header="Bool Type"});
GridView.Columns.Add(new DataGridColumn(){Binding = new Binding("StringType"), Header="String Type"});
提前致谢。
景
答案 0 :(得分:1)
是的,这可以做到,但你需要的不仅仅是“单一课程”。该技术基于DataGridTemplateColumn
,我们将根据其类型为每列选择模板。
1)您需要一个帮助程序类来决定选择哪个模板:
public class ColumnTemplateSelector : ContentControl
{
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
switch (newContent.GetType().Name)
{
case "Boolean":
ContentTemplate = Application.Current.Resources["BooleanDataTemplate"] as DataTemplate;
break;
case "String":
default:
ContentTemplate = Application.Current.Resources["StringDataTemplate"] as DataTemplate;
break;
}
}
}
我知道,这可以做得更好,但我认为它很简单,可以注意到它的全部内容,它可以扩展,优化等。
2)将内容模板添加到App.xaml
文件中,它们可能如下所示(简单示例,您可能想要修改它们):
<Application.Resources>
<DataTemplate x:Key="BooleanDataTemplate">
<CheckBox IsChecked="{Binding}" />
</DataTemplate>
<DataTemplate x:Key="StringDataTemplate">
<TextBlock Text="{Binding}" />
</DataTemplate>
</Application.Resources>
3)现在我们可以设置DataGrid
。需要注意的是,我们需要定义列,我们不能使用AutoGenerateColumns
功能。好的,这是示例代码。首先,将ColumnTemplateSelector
(参见1.)定义的命名空间添加到MainPage.xaml
(或者您需要的地方):
xmlns:local="clr-namespace:MySilverlightExample"
假设我们的班级(称之为“人”)有三列:“姓名”,“年龄”和“IsMarried”(实际上是bool
),您的表格如下:
<sdk:DataGrid ItemsSource="{Binding MyListOfPersonItems}" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:ColumnTemplateSelector Content="{Binding Name}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:ColumnTemplateSelector Content="{Binding Age}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<local:ColumnTemplateSelector Content="{Binding IsMarried}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
也许有一个更短的语法如何写它,但这就是它基本上可以工作的方式,只是在这里测试它并像一个魅力一样工作。
希望这有帮助!