Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF ComboBox - case insensitive data-binding

Tags:

c#

If I'm databinding a WPF combo box, is there a way to make the binding case insensitive?

For example if the combo box is bound to a property whose value is HELLO, get it to select combo box item with value of Hello?

like image 330
Sandy Avatar asked May 09 '14 01:05

Sandy


1 Answers

I accomplished this by implementing an IMultiValueConverter.

The converter is applied to the ItemsSource binding on the ComboBox and sets two bindings. The first for the value that is to be selected. The second is bound to the ItemsSource property of the ComboBox which is a list of possible values.

<ComboBox ItemsSource="{Binding Path=DataContext.EntityTypeOptions, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
    <ComboBox.SelectedValue>
        <MultiBinding Converter="{StaticResource SelectedValueIgnoreCaseConverter}">
            <Binding Path="UpdatedValue" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged" />
            <Binding Path="ItemsSource" Mode="OneWay" RelativeSource="{RelativeSource Mode=Self}" />
        </MultiBinding>
    </ComboBox.SelectedValue>
</ComboBox>

For the converter, the Convert() method finds the selected value in the ItemsSource ignoring case and then returns a matching value from the ItemsSource.

The ConvertBack() method simply puts the selected value back in the first element of the object array.

Imports System.Globalization
Imports System.Windows.Data
Imports System.Collections.ObjectModel

Public Class SelectedValueIgnoreCaseConverter
    Implements IMultiValueConverter

    Public Function Convert(values() As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IMultiValueConverter.Convert
        Dim selectedValue As String = TryCast(values(0), String)
        Dim options As ObservableCollection(Of String) = TryCast(values(1), ObservableCollection(Of String))

        If selectedValue Is Nothing Or options Is Nothing Then
            Return Nothing
        End If

        options.Contains(selectedValue, StringComparer.OrdinalIgnoreCase)
        Dim returnValue As String = Utilities.Conversions.ParseNullToString((From o In options Where String.Equals(selectedValue, o, StringComparison.OrdinalIgnoreCase)).FirstOrDefault)

        Return returnValue
    End Function

    Public Function ConvertBack(value As Object, targetTypes() As Type, parameter As Object, culture As CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack
        Dim result(2) As Object
        result(0) = value
        Return result
    End Function
End Class
like image 186
bkstill Avatar answered Nov 06 '22 03:11

bkstill