j'ai une colonne définie comme ceci:WPF format texte affiché?
<DataGridTextColumn Binding="{Binding Path=FileSizeBytes, Mode=OneWay}" Header="Size" IsReadOnly="True" />
Mais au lieu d'afficher la taille du fichier comme un grand nombre, je voudrais afficher les unités, mais ont toujours la sorte par FileSizeBytes
réelle. Y a-t-il un moyen de le faire passer par une fonction ou quelque chose avant de l'afficher?
@Igor:
Fonctionne très bien.
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();
}
}
Dans le cas où vous ne pouvez pas ajouter une autre propriété à la classe source (il peut y avoir plusieurs raisons à cela), l'autre solution serait de créer un IValueConverter et de le donner à la liaison en utilisant la propriété Converter. Ensuite, chaque fois que la liaison sera mise à jour, elle passera d'abord par le code du convertisseur. – Charlie
Oui, bon point. Une alternative à cela consisterait à envelopper la classe source dans un modèle viewmodel, ce qui dans certains cas pourrait être une surcharge. –
La raison pour laquelle je ne veux pas aller avec plus de propriétés est parce que je dois déclencher un événement PropertyChanged pour chacun d'entre eux ... Je pourrais finir avec des dizaines de déclenchements tous pour ce qui est essentiellement la même chose! De plus, vous liez la présentation avec des données. J'aime bien le 2ème sol'n. – mpen