如何通过DataGridTextColumn中的绑定使用StringFormat?

时间:2012-11-21 18:30:02

标签: wpf mvvm binding string-formatting

我想使用StringFormat在DataGrid中显示我的数据。对象有一个属性,其中包含我想要使用的格式字符串...例如“{0:0。##} mmol / l”或“{0:0。##} mg / dl”来显示结果以不同的单位。

XAML:

<DataGrid ItemsSource="{Binding Results}">
   <DataGrid.Columns>
     <DataGridTextColumn Header="Value" Binding="{Binding Value, Converter={StaticResource stringFormatConverter}}" />

C#中的转换器:

public class StringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0:0.##} mmol/l", value);
    }
    [...]
}

如何告诉转换器使用格式字符串,这是我绑定的项目的属性而不是当前版本的转换器中的属性?

修改: 结果是结果的ObservableCollection,看起来像

public class Result
{
  public double Value {get; set; }
  public string Key {get; set; }
  public string FormatString {get; set; }
  [...]
}

1 个答案:

答案 0 :(得分:1)

您可以将整个对象传递给转换器而不是其Value属性:

<DataGridTextColumn Header="Value" Binding="{Binding Converter={StaticResource stringFormatConverter}}" />

然后,您可以根据给定对象更改转换器以格式化字符串:

public class StringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var result = (Result)value;
        return string.Format(result.FormatString, result.Value);
    }
}

另一种可能的解决方案是让Result类暴露另一个属性,该属性将返回格式化的值,然后绑定FormattedValue(没有转换器):

public class Result
{
    public double Value { get; set; }
    public string Key { get; set; }
    public string FormatString { get; set; }

    public string FormattedValue
    {
        get { return string.Format(FormatString, Value); }
    }
}