我需要使用自定义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。
如何实现理想的行为?谢谢!
答案 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#类。