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

时间:2012-01-26 16:14:53

标签: wpf wpf-controls wpfdatagrid

在阅读了关于如何Customize Auto-Generated Columns的优秀文章后,我遇到了一个问题。

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

<DataGrid x:Name="MyGrid" AutoGeneratingColumn="MyGrid_AutoGeneratingColumn">
  <DataGrid.Resources>
    <DataTemplate x:Key="IntegerTemplate">
      <TextBlock Text="{Binding}" HorizontalAlignment="Right"/>
    </DataTemplate>
  </DataGrid.Resources>
</DataGrid>

然后,在AutoGeneratingColumn DataGrid事件处理程序中,我想为所有整数(即数字)列分配此通用DataTemplate作为CellTemplate

public void MyWindow_AdjustColumnTemplateBasedOnType(
              DataGridAutoGeneratingColumnEventArgs e)
{
  if (/*This is a column I want to change*/)
  {
    DataGridTemplateColumn column=new DataGridTemplateColumn(); 

    column.Header=e.PropertyName;
    column.CellTemplate=MyGrid.FindResource("IntegerTemplate") as DataTemplate; 
    e.Column=column; 
  }
}

问题是Text的{​​{1}}列的值未显示所需的结果。我没有看到其TextBlock列为其DataTemplate的每个单元格中的右对齐值,而是看到:

enter image description here

通过将属性CellTemplate设置为Text来使用空绑定语法显然是不正确的。设置基于路径的绑定确实会产生所需的结果。也就是说,如果我使用类似的东西设置(硬编码数据路径)绑定:

"{Binding}"

然后一切都很好,但我的通用 <DataGrid.Resources> <DataTemplate x:Key="IntegerTemplate"> <!-- Binding hard set to ProductId --> <TextBlock Text="{Binding ProductId}" HorizontalAlignment="Right"/> </DataTemplate> </DataGrid.Resources> 不再是通用的。它不是可重用于所有整数列,而只能用于DataTemplate列,因为绑定固定为该特定数据项的值:

enter image description here

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

3 个答案:

答案 0 :(得分:4)

我相信样式会在这里解决你的问题。

        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>    

答案 1 :(得分:1)

对于那些苦苦于“我应该使用什么是正确的绑定,以便通用DataTemplate实际使用与其关联的列的相应ItemSource属性中的任何值。”

请参阅Jay_Wang在此链接中的回答:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062

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

希望这有帮助。

答案 2 :(得分:0)

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

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

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