Use converter on bound items in combobox

lebhero picture lebhero · Feb 25, 2012 · Viewed 27.1k times · Source

i have a combobox which is bound to a datatable column like this:

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

The IDNr in the Column always starts with 4 letters followed with the ID Number (ex. BLXF1234) . I need to display the items in Combobox without the Letters (i need 1234 to be displayed in the combobox).

So i wrote a converter :

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, how can i tell the combobox to use the converter to display the items ? i tried this in the Xaml:

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

But still not working ...any ideas ? Thanks

Answer

Martin Liversage picture Martin Liversage · Feb 26, 2012

You can modify the ItemTemplate of the ComboBox and use your converter:

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

Each item is bound to the items in the ItemsSource. By using the converter in the binding you are able to perform the conversion you want.