2010-05-19 5 views
6

Quel serait le moyen le plus efficace pour définir la mise en forme personnalisée de la colonne dans DataGrid? Je ne peux pas utiliser le StringFormat suivant, car ma mise en forme sophistiquée dépend également d'une autre propriété de ce ViewModel. (Formatage de prix par exemple a une logique de mise en forme complexe basée sur différents marchés.)Personnalisé StringFormat dans WPF DataGrid

Binding ="{Binding Price, StringFormat='{}{0:#,##0.0##}'}" 

Répondre

6

Vous pouvez utiliser un MultiBinding avec un convertisseur. Tout d'abord définir un IMultiValueConverter qui met en forme la première valeur en utilisant le format spécifié dans la seconde:

public class FormatConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     // some error checking for values.Length etc 
     return String.Format(values[1].ToString(), values[0]); 
    } 

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

maintenant lier à la fois votre propriété ViewModel et le format à la même chose:

<MultiBinding Converter="{StaticResource formatter}"> 
    <Binding Path="Price" /> 
    <Binding Path="PriceFormat" /> 
</MultiBinding> 

La belle partie de cette est-ce que la logique de mise en forme de Price peut vivre dans ViewModel et être testable. Sinon, vous pouvez déplacer cette logique dans le convertisseur et transmettre toutes les autres propriétés dont il a besoin.

+0

C'est élégant, jamais utilisé Multi liaisons avant, semble être une bien meilleure solution à la mise en forme complexe que le paramètre du convertisseur. –

+0

Et bien sûr, rien n'empêche @Boris d'implémenter simplement une propriété "FormattedPrice" sur son ViewModel et de s'y lier. Ce serait encore plus facile s'il n'était pas aussi flexible. –

+0

merci! Ça marche! Avoir "FormattedPrice" serait plus facile mais moins élégant. J'ai au moins 10 prix différents dans mon DataGrid. Ma seule préoccupation à ce stade est les implications de performance de IMultiValueConverter. –