Отображаемый текст формата WPF?

Мне определили столбец как это:


Но вместо того, чтобы отобразить размер файла как большое количество, я хотел бы к дисплеям, но все еще имел бы его вид фактическим 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();
    }
}

6
задан mpen 7 May 2010 в 01:19
поделиться

3 ответа

Привязка к функции возможна в 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" />
2
ответ дан 17 December 2019 в 00:05
поделиться

Вы можете попробовать использовать StringFormat в своем выражении привязки, если используете .NET 3.5SP1 или потом. См. этот пост в блоге Лестера WPF или этот пост в блоге Винса Сибала , где приведены некоторые примеры синтаксиса.Добавление StringFormat к привязкам устранит большинство потребностей в преобразователях ценности и позволит сохранить форматирование вместе с разметкой, а не отключать его где-то в другом классе. Это, конечно, намного меньше набора текста.

Может быть, что-то вроде этого сработает:

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

Я не уверен, что при нажатии на заголовок для сортировки элементов они будут отсортированы как строки или как базовый тип данных, так что в зависимости от того, как выглядит ваше выражение форматирования , вы можете получить или не получить желаемое поведение сортировки.

4
ответ дан 17 December 2019 в 00:05
поделиться

Для целей форматирования подходящей реализацией является определение IValueConverter. Посмотрите этот пример: link text

1
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: