【问题标题】:C# WPF datgird IvalueConverter binding problemsC# WPF datgird IvalueConverter 绑定问题
【发布时间】:2017-10-16 03:45:10
【问题描述】:

我有一个数据网格,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 上时,它实际上开始被调用,并按照我想要的方式处理(返回格式为 F2)。 但它不起作用,数据网格仍然以未处理的方式显示值。 我知道我还有其他方法可以实现这一点,但我只想知道为什么这不起作用。是 IValueConverter 还是 xaml 代码不正确。

【问题讨论】:

    标签: c# wpf xaml datagrid ivalueconverter


    【解决方案1】:

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

    【讨论】:

    • 它在我的情况下运行良好,但我想知道值是否通过调用 NotifyPropertyChanged 不断变化。在系统上会花费很多吗?无论如何,非常感谢。
    • 没有。该列仅生成一次。如果您的原始问题已经解决,请记住接受答案:meta.stackexchange.com/questions/5234/…
    【解决方案2】:

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

    如果您想为所有单元格做某事,请使用 DataGrid.CellStyle。

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

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

    我猜你还会遇到其他问题,花这么多时间来找出它为什么不起作用并没有真正的意义。如果您以正确的方式进行操作,那就更好了。您可以在我的文章CodeProject.com: Guide to WPF DataGrid formatting using bindings中找到有关如何为 WPF DataGrid 正确进行数据绑定和格式化的详细说明

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我的datagrid'itemssource已经等于一个ObservableCollection,如果我使用你建议的方式,它会给我一个例外:使用ItemsSource之前Items集合必须为空。
      猜你喜欢
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多