自定义DataGrid列,带有CellTemplate和绑定

时间:2010-08-17 11:17:57

标签: silverlight datagrid binding datagridtemplatecolumn

我需要使用自定义CellTemplate创建可重用的DataGrid列。除其他外,这个CellTemplate应该包含一个TextBlock控件,我需要将值绑定到DataGrid中显示。到目前为止,我看到的所有示例都是在DataGrid的Columns属性中直接指定CellTemplate,并且还直接指定了绑定到TextBlock,例如:

<data:DataGrid>
    <data:DataGrid.Columns>
        <data:DataGridTemplateColumn Header="Name">
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

我需要将此列封装到一个可重用的控件中,我想为它指定一个Binding,就像普通的DataGridTextColumn一样。换句话说,当使用这个自定义列时,我只想写这样的东西:

<data:DataGrid>
    <data:DataGrid.Columns>
        <controls:CustomColumn Header="Name" Binding="{Binding Name}" />
    </data:DataGrid.Columns>
</data:DataGrid>

问题是我的自定义列继承的DataGridTemplateColumn没有Binding属性。我以为我可以使用DataGridBoundColumn,但是不能为它指定CellTemplate。

如何实现理想的行为?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为最简单的方法是创建一个自定义控件,然后像这样使用它:

            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <controls:CustomColumn Header="Name" Binding="{Binding Name}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

昨天我做了类似的事情,效果很好

答案 1 :(得分:1)

这个问题已经很老了,但是我最近亲自面对了这个问题。上面@Gregfr答案的替代方法是编写自定义DataGridColumn类。以下是我对DatePicker列所做的操作:

 public class DataGridDatePickerColumn : DataGridBoundColumn
  {
    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
      var datePicker = new DatePicker();
      datePicker.SetBinding(DatePicker.TextProperty, this.Binding);
      datePicker.SetBinding(DatePicker.SelectedDateProperty, this.Binding);
      return datePicker;
    }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
      var textBlock = new TextBlock();
      textBlock.SetBinding(TextBlock.TextProperty, this.Binding);
      return textBlock;
    }
  }

然后我在xaml页的单线调用中使用它,如下所示:

<h:DataGridDatePickerColumn IsReadOnly="False" Header="Some Date" Binding="{Binding SomeDate, StringFormat='dd.MM.yyyy'}" />

您的情况下,您可以通过编写与PreviewTextInput属性一起使用的支持函数并使用[0-9] +等正则表达式来控制编辑,来扩展此C#类。