【问题标题】:customized StringFormat in WPF DataGridWPF DataGrid 中的自定义 StringFormat
【发布时间】:2010-05-19 01:24:26
【问题描述】:

在 DataGrid 中设置列​​的自定义格式最有效的方法是什么?我不能使用以下 StringFormat,因为我的复杂格式还取决于此 ViewModel 的其他一些属性。 (例如,价格格式根据不同的市场有一些复杂的格式逻辑。)

Binding ="{Binding Price, StringFormat='{}{0:#,##0.0##}'}"

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您可以将 MultiBinding 与转换器一起使用。首先定义一个 IMultiValueConverter,它使用第二个中指定的格式格式化第一个值:

    public class FormatConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            // some error checking for values.Length etc
            return String.Format(values[1].ToString(), values[0]);
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    现在将您的 ViewModel 属性和格式绑定到同一个东西:

    <MultiBinding Converter="{StaticResource formatter}">
        <Binding Path="Price" />
        <Binding Path="PriceFormat" />
    </MultiBinding>
    

    这方面的好处在于,如何格式化 Price 的逻辑可以存在于 ViewModel 中并且是可测试的。否则,您可以将该逻辑移入转换器并传入它需要的任何其他属性。

    【讨论】:

    • 这很优雅,以前从未使用过 Multi 绑定,似乎比转换器参数更好地解决复杂格式问题。
    • 当然,没有什么能阻止@Boris 在他的 ViewModel 上简单地实现一个“FormattedPrice”属性并绑定到它。如果没有那么灵活,那会更容易。
    • 谢谢!有用!拥有“FormattedPrice”会更容易但不那么优雅。我的数据网格中至少有 10 种不同的价格。在这个阶段我唯一关心的是 IMultiValueConverter 的性能影响。
    • @Boris 我在几个项目中大量使用了 IMultiValueConverters,它们似乎不会以任何明显的方式影响性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2023-03-08
    • 2011-08-17
    • 2012-07-20
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多