C# WPF datgird IvalueConverter绑定问题
C# WPF datgird IvalueConverter binding problems
我有一个数据网格,itemssoure 是一个 ObservableCollection。
我想在它转到数据网格之前更改它的值格式。
下面是xaml.
的代码
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Setters>
<Setter Property="TextBlock.Text" Value="{Binding Path=Cash, Converter={StaticResource DecimalConverter}}"/>
<Setter Property="TextBlock.TextAlignment" Value="Center"></Setter>
</Style.Setters>
</Style>
</DataGrid.CellStyle>
我要更改的列是"Cash",IValueConverter 在这里
public class DecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double result = 0;
if (value is double)
result = (double)value;
return result.ToString("F2");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
当我把断点放在函数DecimalConverter上时,它实际上开始调用,并按照我想要的方式处理(return格式为F2)。
但它不起作用,数据网格仍以未处理的方式显示值。
我知道我有其他方法可以实现此目的,但我只想知道为什么这不起作用。是 IValueConverter 或者 xaml 代码不正确。
DataGridCell 样式不是设置文本绑定的正确位置。改为使用数据网格列的绑定:
<DataGridTextColumn Binding="{Binding Path=Cash, Converter={StaticResource DecimalConverter}}" />
A DataGridCell
没有 TextBlock.Text
属性 所以你的 Style
根本没有效果。
我猜您使用的是自动生成的列。然后,您可以处理 AutoGeneratingColumn
事件并设置绑定的 StringFormat
属性:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTextColumn col = e.Column as DataGridTextColumn;
if (col != null && e.PropertyType == typeof(double))
{
col.Binding = new Binding(e.PropertyName) { StringFormat = "F2" };
}
}
格式化 WPF DataGrid 是出了名的困难。有成百上千的事情都可能出错。在您的情况下,您想要将 "Cash" 列的转换器分配给网格中的每个单元格是没有意义的。
如果您想对所有单元格进行操作,请使用 DataGrid.CellStyle。
如果您想对列中的所有单元格执行某些操作,请使用 DataGridColumn.CellStyle。
你的下一个问题是绑定。在 DataGrid 中,每一行都必须绑定到不同的记录。 WPF 专门为此目的制作了 DataGridColumn.Binding 属性。它在运行时为每个数据记录创建一个新绑定到 DataGrid 中的新行。
我猜你还会遇到其他问题,花那么多时间来找出它为什么不起作用并没有多大意义。如果您以正确的方式进行操作会更好。您可以在我的文章 CodeProject.com: Guide to WPF DataGrid formatting using bindings
中找到有关如何为 WPF DataGrid 正确进行数据绑定和格式化的详细说明
我有一个数据网格,itemssoure 是一个 ObservableCollection。 我想在它转到数据网格之前更改它的值格式。 下面是xaml.
的代码 <DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Setters>
<Setter Property="TextBlock.Text" Value="{Binding Path=Cash, Converter={StaticResource DecimalConverter}}"/>
<Setter Property="TextBlock.TextAlignment" Value="Center"></Setter>
</Style.Setters>
</Style>
</DataGrid.CellStyle>
我要更改的列是"Cash",IValueConverter 在这里
public class DecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double result = 0;
if (value is double)
result = (double)value;
return result.ToString("F2");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
当我把断点放在函数DecimalConverter上时,它实际上开始调用,并按照我想要的方式处理(return格式为F2)。 但它不起作用,数据网格仍以未处理的方式显示值。 我知道我有其他方法可以实现此目的,但我只想知道为什么这不起作用。是 IValueConverter 或者 xaml 代码不正确。
DataGridCell 样式不是设置文本绑定的正确位置。改为使用数据网格列的绑定:
<DataGridTextColumn Binding="{Binding Path=Cash, Converter={StaticResource DecimalConverter}}" />
A DataGridCell
没有 TextBlock.Text
属性 所以你的 Style
根本没有效果。
我猜您使用的是自动生成的列。然后,您可以处理 AutoGeneratingColumn
事件并设置绑定的 StringFormat
属性:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTextColumn col = e.Column as DataGridTextColumn;
if (col != null && e.PropertyType == typeof(double))
{
col.Binding = new Binding(e.PropertyName) { StringFormat = "F2" };
}
}
格式化 WPF DataGrid 是出了名的困难。有成百上千的事情都可能出错。在您的情况下,您想要将 "Cash" 列的转换器分配给网格中的每个单元格是没有意义的。
如果您想对所有单元格进行操作,请使用 DataGrid.CellStyle。
如果您想对列中的所有单元格执行某些操作,请使用 DataGridColumn.CellStyle。
你的下一个问题是绑定。在 DataGrid 中,每一行都必须绑定到不同的记录。 WPF 专门为此目的制作了 DataGridColumn.Binding 属性。它在运行时为每个数据记录创建一个新绑定到 DataGrid 中的新行。
我猜你还会遇到其他问题,花那么多时间来找出它为什么不起作用并没有多大意义。如果您以正确的方式进行操作会更好。您可以在我的文章 CodeProject.com: Guide to WPF DataGrid formatting using bindings
中找到有关如何为 WPF DataGrid 正确进行数据绑定和格式化的详细说明