WPF DataGrid中自定义的StringFormat

6
什么是在DataGrid中设置自定义列格式的最有效方法?我不能使用以下StringFormat,因为我的复杂格式化还取决于此ViewModel的其他某些属性。(例如,基于不同市场的价格格式化具有一些复杂的格式化逻辑。)
Binding ="{Binding Price, StringFormat='{}{0:#,##0.0##}'}"
1个回答

6
您可以使用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中并进行测试。否则,您可以将该逻辑移至转换器并传入其他所需属性。

这很优雅,以前从未使用过多绑定,似乎比转换器参数更好地解决了复杂的格式问题。 - Igor Zevaka
当然,@Boris可以在他的ViewModel上实现一个“FormattedPrice”属性并绑定它,这样就没有任何障碍了。如果不需要那么灵活,这将更容易。 - Matt Hamilton
谢谢!它有效了!拥有“FormattedPrice”会更容易,但不够优雅。我的数据网格中至少有10个不同的价格。我现在唯一关心的是IMultiValueConverter的性能影响。 - Boris Lipschitz
@Boris 我在几个项目中广泛使用了 IMultiValueConverters,它们似乎并没有对性能产生明显影响。 - Matt Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接