2010-05-19 19 views
6

Quale sarebbe il modo più efficiente per impostare la formattazione personalizzata della colonna in DataGrid? Non posso usare il seguente StringFormat, poiché la mia sofisticata formattazione dipende anche da qualche altra proprietà di questo ViewModel. (Es Prezzo formattazione ha una certa logica di formattazione complessa basata su diversi mercati.)StringFormat personalizzato in WPF DataGrid

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

risposta

6

si potrebbe usare un MultiBinding con un convertitore. In primo luogo definire un IMultiValueConverter che formatta il primo valore utilizzando il formato di cui al secondo:

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

Ora hanno aderito entrambe la vostra proprietà ViewModel e il formato per la stessa cosa:

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

La parte bella di questo è che la logica per come dovrebbe essere formattato Price può vivere nel ViewModel ed essere testabile. Altrimenti si potrebbe spostare quella logica nel convertitore e passare in qualsiasi altra proprietà di cui aveva bisogno.

+0

Questo è un binding elegante e mai utilizzato in precedenza, sembra una soluzione molto migliore per la formattazione complessa rispetto al parametro del convertitore. –

+0

Ovviamente non c'è nulla che impedisca a @ Boris di implementare semplicemente una proprietà "FormattedPrice" sul suo ViewModel e di legarsi a questo. Sarebbe ancora più facile se non fosse flessibile. –

+0

grazie! Funziona! Avere "FormattedPrice" sarebbe più facile ma meno elegante. Ho almeno 10 prezzi diversi nel mio datagrid. La mia unica preoccupazione in questa fase sono le implicazioni sulle prestazioni di IMultiValueConverter. –