将DataGridCheckBoxColumn和DataGridTextColumn组合到一个类中?

时间:2011-05-06 19:38:04

标签: c# silverlight

从我在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"});

提前致谢。

1 个答案:

答案 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>

也许有一个更短的语法如何写它,但这就是它基本上可以工作的方式,只是在这里测试它并像一个魅力一样工作。

希望这有帮助!