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。

如何实现期望的行为?谢谢!

4

2 回答 2

2

这个问题很老了,但我最近自己也遇到了这个问题。上面@Gregfr 答案的替代方法是编写您的自定义 DataGridColumn 类。以下是我为 DatePicker Column 所做的:

 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# 类。

于 2019-11-04T16:44:41.620 回答
1

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

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

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

于 2011-09-02T16:30:48.077 回答