2010-05-19 21 views
6

¿Cuál sería la forma más eficiente de configurar el formato personalizado de la columna en DataGrid? No puedo usar el siguiente StringFormat, ya que mi formato sofisticado también depende de alguna otra propiedad de este ViewModel. (Por ejemplo el formato de precio tiene algo de lógica complicada formato basado en diferentes mercados.)StringFormat personalizado en WPF DataGrid

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

Respuesta

6

Se puede usar un MultiBinding con un convertidor. En primer lugar definir un IMultiValueConverter que formatea el primer valor utilizando el formato especificado en el segundo:

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(); 
    } 
} 

Ahora se unen tanto su propiedad modelo de vista y el formato de la misma cosa:

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

La parte buena de esto es que la lógica de cómo debería formatearse Price puede vivir en ViewModel y ser comprobable. De lo contrario, podría mover esa lógica al convertidor y pasar cualquier otra propiedad que necesitara.

+0

Eso es elegante, nunca se utilizó Multi enlaces antes, parece una solución mucho mejor para el formato complejo que el parámetro del convertidor. –

+0

Y, por supuesto, nada impide que @Boris simplemente implemente una propiedad de "Precio Formateado" en su ViewModel y se vincule a eso. Eso sería aún más fácil si no tan flexible. –

+0

gracias! ¡Funciona! Tener "FormattedPrice" sería más fácil pero menos elegante. Tengo al menos 10 precios diferentes en mi cuadrícula de datos. Mi única preocupación en esta etapa son las implicaciones de rendimiento de IMultiValueConverter. –