Мне определили столбец как это:
Но вместо того, чтобы отобразить размер файла как большое количество, я хотел бы к дисплеям, но все еще имел бы его вид фактическим 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();
}
}
Привязка к функции возможна в 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" />
EDIT Альтернативное решение, спасибо Чарли за указание.
Вы можете написать собственный конвертер значений, реализовав 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" />
Вы можете попробовать использовать StringFormat в своем выражении привязки, если используете .NET 3.5SP1 или потом. См. этот пост в блоге Лестера WPF или этот пост в блоге Винса Сибала , где приведены некоторые примеры синтаксиса.Добавление StringFormat к привязкам устранит большинство потребностей в преобразователях ценности и позволит сохранить форматирование вместе с разметкой, а не отключать его где-то в другом классе. Это, конечно, намного меньше набора текста.
Может быть, что-то вроде этого сработает:
<DataGridTextColumn
Binding="{Binding Path=FileSizeBytes, Mode=OneWay, StringFormat='\{0:N0\} bytes'}"
Header="Size" IsReadOnly="True" />
Я не уверен, что при нажатии на заголовок для сортировки элементов они будут отсортированы как строки или как базовый тип данных, так что в зависимости от того, как выглядит ваше выражение форматирования , вы можете получить или не получить желаемое поведение сортировки.
Для целей форматирования подходящей реализацией является определение IValueConverter. Посмотрите этот пример: link text