C#WPF datgird IvalueConverter绑定问题

时间:2017-10-16 03:45:10

标签: c# wpf xaml datagrid ivalueconverter

我有一个数据网格,而itemssoure是一个ObservableCollection。 我想在它进入datagrid之前改变它的值格式。 下面是xaml的代码。

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

我要更改的列是“Cash”,IValueConverter就在这里。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:id="@+id/sample1"
        android:layout_centerVertical="true"
        android:text="sample1"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:layout_below="@+id/sample1"
        android:text="sample2"/>
</RelativeLayout>

当我把断点放在函数DecimalConverter上的断点时,它实际上是开始调用,并按照我想要的方式处理(返回格式为F2)。 但它无法正常工作,数据网格仍然以未经处理的方式显示价值。 我知道我有其他方法可以实现这一目标,但我只是想知道为什么这不起作用。它是IValueConverter或xaml代码不正确。

3 个答案:

答案 0 :(得分:1)

格式化WPF DataGrid非常困难。有数百种可能出错的事情。在您的情况下,您希望将“现金”列的转换器分配给网格中的每个单元格是没有意义的。

如果要为所有单元格执行某些操作,请使用DataGrid.CellStyle。

如果要为列中的所有单元格执行某些操作,请使用DataGridColumn.CellStyle。

你的下一个问题是绑定。在DataGrid中,每行必须绑定到不同的Record。 WPF明确地为此目的制作了DataGridColumn.Binding属性。它在运行时为每个数据记录创建一个新的绑定到DataGrid中的新行。

我想你也会遇到其他问题,花这么多时间找出它无效的原因并没有多大意义。如果你以正确的方式做到这一点会更好。您可以在我的文章CodeProject.com: Guide to WPF DataGrid formatting using bindings

中找到有关如何为WPF DataGrid正确进行数据绑定和格式化的详细说明。

答案 1 :(得分:0)

DataGridCell样式不是设置文本绑定的正确位置。请改为使用数据网格列的绑定:

<DataGridTextColumn Binding="{Binding Path=Cash, Converter={StaticResource DecimalConverter}}" />

答案 2 :(得分:0)

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