【发布时间】:2010-05-19 01:24:26
【问题描述】:
在 DataGrid 中设置列的自定义格式最有效的方法是什么?我不能使用以下 StringFormat,因为我的复杂格式还取决于此 ViewModel 的其他一些属性。 (例如,价格格式根据不同的市场有一些复杂的格式逻辑。)
Binding ="{Binding Price, StringFormat='{}{0:#,##0.0##}'}"
【问题讨论】:
在 DataGrid 中设置列的自定义格式最有效的方法是什么?我不能使用以下 StringFormat,因为我的复杂格式还取决于此 ViewModel 的其他一些属性。 (例如,价格格式根据不同的市场有一些复杂的格式逻辑。)
Binding ="{Binding Price, StringFormat='{}{0:#,##0.0##}'}"
【问题讨论】:
您可以将 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 中并且是可测试的。否则,您可以将该逻辑移入转换器并传入它需要的任何其他属性。
【讨论】: