我有一个数据网格,而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代码不正确。
答案 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" };
}
}