【问题标题】:Customizing Auto-Generated Columns in the DataGrid Control在 DataGrid 控件中自定义自动生成的列
【发布时间】:2012-02-19 17:32:27
【问题描述】:

在阅读了关于如何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; 
  }
}

问题是TextBlockText 列的值没有显示想要的结果。而不是在每个单元格中看到正确的值,其列有这个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 属性中的任何值。

【问题讨论】:

  • @Michael Goldshteyn:我也有同样的问题,你找到解决办法了吗?

标签: wpf wpf-controls wpfdatagrid


【解决方案1】:

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

        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 这正是我的做法。我使用Style 而不是DataTemplate
【解决方案2】:

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

在此链接中查看 Jay_Wang 的答案:

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

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2017-04-21
      相关资源
      最近更新 更多