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 正确进行数据绑定和格式化的详细说明