web-dev-qa-db-fra.com

Utiliser le convertisseur sur les éléments liés dans la zone de liste déroulante

j'ai une combobox qui est liée à une colonne datatable comme celle-ci:

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

L'IDNr dans la colonne commence toujours par 4 lettres suivies du numéro d'identification (ex. BLXF1234). J'ai besoin d'afficher les éléments dans la combobox sans les lettres (j'ai besoin de 1234 pour être affiché dans la combobox).

J'ai donc écrit un convertisseur:

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

Non, comment puis-je dire à la zone de liste déroulante d'utiliser le convertisseur pour afficher les éléments? j'ai essayé ceci dans le Xaml:

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

Mais ça ne marche toujours pas ... des idées? Merci

30
lebhero

Vous pouvez modifier le ItemTemplate du ComboBox et utiliser votre convertisseur:

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

Chaque élément est lié aux éléments de ItemsSource. En utilisant le convertisseur dans la liaison, vous pouvez effectuer la conversion souhaitée.

61
Martin Liversage