2012-01-26 60 views
3

在阅读关于如何Customize Auto-Generated Columns的优秀文章后,我遇到了一个问题。自定义DataGrid控件中的自动生成列

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

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

然后,在AutoGeneratingColumnDataGrid事件处理程序,我要分配这个通用DataTemplateCellTemplate所有积分(即数字)列:

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; 
    } 
} 

问题是TextBlockText列的值不显示所需的结果。相反,在每个小区其列在看到右对齐值有这个DataTemplateCellTemplate,我看到:

enter image description here

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

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

然后一切都很好,但我一般DataTemplate不再是通用的。相反,它是可重复使用的所有整数列,它只能用于ProductId列,因为结合被固定在特定数据项的值:

enter image description here

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

+0

@迈克尔Goldshteyn:我有同样的问题,你有没有找到一个解决方案 –

回答

0

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

这个ValueConverter将你ViewModels对象的数据(实际上是你想使用TemplateColum而不是普通TextColumn的原因)转换为可表示的字符串形式。

你有这样的转换器,或者你在ViewModels对象中提供了ToString()方法吗?如果不尝试,也许这有助于...

3

我相信风格将解决您的问题在这里。

 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>  
+0

+1这正是我怎么做,我用的不是'一个的DataTemp'Style'? late' –