WPF格式显示文字?

时间:2010-05-06 23:02:59

标签: c# wpf xaml .net-4.0

我的列定义如下:

<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay}" Header="Size" IsReadOnly="True" />

但是我不想将文件大小显示为大数字,而是显示单位,但仍按实际FileSizeBytes排序。有没有什么方法可以在显示之前通过函数或其他东西运行它?


@Igor:

效果很好。

http://img200.imageshack.us/img200/4717/imageget.jpg

[ValueConversion(typeof(long), typeof(string))]
class FileSizeConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string[] units = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
        double size = (long)value;
        int unit = 0;

        while (size >= 1024)
        {
            size /= 1024;
            ++unit;
        }

        return String.Format("{0:0.#} {1}", size, units[unit]);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3 个答案:

答案 0 :(得分:4)

如果您使用的是.NET 3.5SP1或更高版本,则可以尝试在绑定表达式中使用StringFormat。有关语法示例,请参阅this post on Lester's WPF Blogthis post at Vince Sibal's blog。将StringFormat添加到绑定将消除对值转换器的大多数需求,并方便地使用标记保持格式,而不是在某个地方的另一个类中。打字肯定少了很多。

也许这样的事情会起作用:

<DataGridTextColumn
  Binding="{Binding Path=FileSizeBytes, Mode=OneWay, StringFormat='\{0:N0\} bytes'}"
  Header="Size" IsReadOnly="True" />

我不确定点击标题对项目进行排序会将它们排序为字符串或基础数据类型,因此,根据您的格式表达式的样子,您可能会或可能不会得到所需的排序行为。

答案 1 :(得分:2)

在WPF中绑定到函数是可能的,但它通常很痛苦。在这种情况下,更优雅的方法是创建另一个返回格式化字符串并绑定到该属性的属性。

class FileInfo {
  public int FileSizeBytes {get;set;}
  public int FileSizeFormatted {
   get{
     //Using general number format, will put commas between thousands in most locales.
     return FileSizeBytes.ToString("G");
   }
  }
}

在XAML中,绑定到FileSizeFormatted

<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay}" Header="Size" IsReadOnly="True" />

编辑替代解决方案,感谢Charlie指出这一点。

您可以通过实施IValueConverter来编写自己的价值转换器。

[ValueConversion(typeof(int), typeof(string))]
public class IntConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        //needs more sanity checks to make sure the value is really int
        //and that targetType is string
        return ((int)value).ToString("G");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        //not implemented for now
        throw new NotImplementedException();
    }
}

然后在XAML中:

<UserControl.Resources>
  <src:DateConverter x:Key="intConverter"/>
</UserControl.Resources>
...
<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay, Converter={StaticResource intConverter}}" Header="Size" IsReadOnly="True" />

答案 2 :(得分:1)

出于格式化目的,适当的实现是定义IValueConverter。检查此样本: link text