在阅读了关于如何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
的每个单元格中的右对齐值,而是看到:
通过将属性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
属性中的任何值。
答案 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()方法?如果不尝试,也许这会有所帮助...