Wpf 自定义DataGrid控件中自动生成的列

Wpf 自定义DataGrid控件中自动生成的列,wpf,wpf-controls,wpfdatagrid,Wpf,Wpf Controls,Wpfdatagrid,在阅读了关于如何使用的优秀文章后,我遇到了一个问题 在尝试自定义DataGrid控件中自动生成的列时,我想做一些简单的事情,比如确保所有数字列值都正确对齐。为此,我创建了一个DataTemplate,如下所示: <DataGrid x:Name="MyGrid" AutoGeneratingColumn="MyGrid_AutoGeneratingColumn"> <DataGrid.Resources> <DataTemplate x:Key="Int

在阅读了关于如何使用的优秀文章后,我遇到了一个问题

在尝试自定义
DataGrid
控件中自动生成的列时,我想做一些简单的事情,比如确保所有数字列值都正确对齐。为此,我创建了一个
DataTemplate
,如下所示:

<DataGrid x:Name="MyGrid" AutoGeneratingColumn="MyGrid_AutoGeneratingColumn">
  <DataGrid.Resources>
    <DataTemplate x:Key="IntegerTemplate">
      <TextBlock Text="{Binding}" HorizontalAlignment="Right"/>
    </DataTemplate>
  </DataGrid.Resources>
</DataGrid>
问题是
TextBlock
Text
列的值没有显示所需的结果。我看到的不是每个单元格中的右对齐值,这些单元格的列将此
DataTemplate
作为其
CellTemplate
,而是:

通过将属性
Text
设置为
“{binding}”
来使用空绑定语法显然是不正确的。设置基于路径的绑定不会产生所需的结果。也就是说,如果我使用以下内容设置(硬编码数据路径)绑定:

  <DataGrid.Resources>
    <DataTemplate x:Key="IntegerTemplate">
      <!-- Binding hard set to ProductId -->
      <TextBlock Text="{Binding ProductId}" HorizontalAlignment="Right"/>
    </DataTemplate>
  </DataGrid.Resources>

那么一切都很好,但是我的通用
DataTemplate
不再是通用的。它不能对所有整数列重复使用,而只能用于
ProductId
列,因为绑定固定到该特定数据项的值:


我应该使用什么样的正确绑定,以便泛型
DataTemplate
实际使用与其关联的列的相应
ItemSource
属性中的任何值。

在DataGrid上下文中使用TemplateColumn时,通常还必须使用ValueConverter

此ValueConverter将ViewModels对象中的数据(这实际上是您希望使用TemplateColumn而不是普通TextColumn的原因)转换为可表示的字符串形式


您是否有这样的转换器,或者在ViewModels对象中提供了ToString()方法?如果不试试,也许会有帮助

我相信风格会解决你的问题

        private void MyGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {  
            if (/*This is a column I want to change*/)
            {
                DataGridColumn column = e.Column;
                column.CellStyle = MyGrid.FindResource("IntegerTemplate") as Style;

            }
        }
在XAML中,您可以编写

<Style TargetType="DataGridCell" x:Key="IntegerTemplate">
     <Setter Property="FontWeight" Value="Bold"></Setter>
</Style>    

适用于“我应该使用什么样的正确绑定,以便泛型DataTemplate实际使用与其关联的列的相应ItemSource属性中的任何值”的用户

请参阅此链接中王杰的答案:

重要的一点是重写System.Windows.FrameworkElement GenerateElement函数,以便它可以通过编程设置绑定以使用列名


希望这能有所帮助。

@Michael Goldshteyn:我也有同样的问题,你找到解决办法了吗?+1我就是这么做的。我使用
样式
而不是
数据模板
<Style TargetType="DataGridCell" x:Key="IntegerTemplate">
     <Setter Property="FontWeight" Value="Bold"></Setter>
</Style>