WPF формат отображаемого текста? - PullRequest
6 голосов
/ 07 мая 2010

У меня есть столбец, определенный следующим образом:

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

Но вместо того, чтобы отображать размер файла в виде большого числа, я бы хотел отобразить единицы измерения, но все равно сортировать их по фактическому FileSizeBytes. Есть ли какой-нибудь способ, которым я могу запустить его через функцию или что-то еще до его отображения?


@ Игорь:

Отлично работает.

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 ]

4 голосов
/ 07 мая 2010

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

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

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

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

2 голосов
/ 07 мая 2010

Привязка к функции возможна в 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" />

РЕДАКТИРОВАТЬ Альтернативное решение, спасибо Чарли за указание на это.

Вы можете написать свой собственный преобразователь значений, реализовав 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" />
1 голос
/ 07 мая 2010

В целях форматирования соответствующая реализация определяет IValueConverter. Проверьте этот образец: текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...