使用CellTemplate和绑定创建自定义DataGrid列

4

我需要创建一个可重复使用的带有自定义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>

我需要将这一列封装为一个可重用的控件,并且想要像普通的DataGridTextColumn一样为其指定绑定。换句话说,当使用这个自定义列时,我只想写出以下内容:

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

问题在于我自定义列继承的DataGridTemplateColumn没有Binding属性。我以为我能够使用DataGridBoundColumn,但是无法为其指定CellTemplate。
如何实现所需的行为?谢谢!
2个回答

2
这个问题很老了,但我最近自己也遇到了这个问题。@Gregfr的回答有一个替代方案,就是编写自定义的DataGridColumn类。以下是我为日期选择列所做的工作:
 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'}" />

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


1
我认为最简单的方法是创建一个自定义控件,然后像这样使用它:
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <controls:CustomColumn Header="Name" Binding="{Binding Name}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

我昨天做了类似的事情,效果还不错


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接