2012-02-25 7 views
16

ho una casella combinata che è legato a una colonna DataTable come questo:.Usa convertitore su oggetti legati a combobox

ComboBox.DataContext = DataDataTable;     
ComboBox.DisplayMemberPath = DataDataTable.Columns["IDNr"].ToString(); 

L'IdNr nella Colonna inizia sempre con 4 lettere seguito con il numero ID (ex BLXF1234). Ho bisogno di visualizzare gli elementi in Combobox senza le lettere (ho bisogno di 1234 per essere visualizzato nella casella combinata).

Così ho scritto un convertitore:

class IDPrefixValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      string s = value.ToString(); 
      if (s.Contains("BL")) 
      { 
       return s.Substring(4); 
      } 
      else 
      { 
       return s; 
      } 
     } 
     return ""; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    }  

No, come posso dire la casella combinata di utilizzare il convertitore per visualizzare gli articoli? Ho provato questo nel Xaml:

ItemsSource="{Binding}" 
DisplayMemberPath="{Binding Converter={StaticResource IDPrefixValueConverter}}" 

Ma ancora non funziona ... tutte le idee? Grazie

+0

mmm ... ancora non so dove si trova l'errore ... – lebhero

+0

'DisplayMemberPath' è un ** percorso di una proprietà ** per visualizzare nemmeno un binding. Se applichi il convertitore, non ottieni nulla. –

+0

ok, grazie comunque iam controllando cosa dovrebbe essere la formattazione degli elementi della casella combinata !!!? – lebhero

risposta

42

è possibile modificare il ItemTemplate del ComboBox e utilizzare il convertitore:

<ComboBox ItemsSource="{Binding}"> 
    <ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Converter={StaticResource IDPrefixValueConverter}}"/> 
    </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Ogni elemento è legato alle voci del ItemsSource. Usando il convertitore nel binding è possibile eseguire la conversione desiderata.

+0

Grazie, il problema stava legando la combobox nel codice dietro ... ma questo ha risolto il mio problema .. – lebhero

+1

Questo applica veramente il convertitore a uno qualsiasi degli elementi nella lista? Ho provato il codice ma sembra che il convertitore sia usato solo per l'oggetto selezionato. – tabina

+0

@tabina: Funziona con un semplice 'ComboBox' come quello nel mio esempio. Forse hai un 'ComboBox' più complesso? Ecco la risposta a una domanda che sembra essere l'opposto del tuo problema: http://stackoverflow.com/a/8247049/98607 –