efspam
efspam

Reputation: 67

WPF Combobox bind text

Maybe a simple task but I can't find the solution. I have a combobox connected to a database. Instead of displaying the content of ProductLookup I just want to display the words 'male' and 'female' on the popup menu.

Thank you

<ComboBox Height="23" Name="ComboBox2" Width="120"  IsEditable="False"
                      ItemsSource="{Binding Source={StaticResource ProductLookup}}"
                      SelectedValue="{Binding Path=ProductID}" 
                      SelectedValuePath="ProductID" 
                      DisplayMemberPath="Name"/>

Upvotes: 3

Views: 4365

Answers (2)

Colin Smith
Colin Smith

Reputation: 12530

Write a Converter that takes one of your "Product" objects....looks at the gender related data inside it, or does the gender determining logic, and then returns the gender string, "male" or "female".

Then use it in your XAML to set the TextBlock:

<StackPanel Height="197" HorizontalAlignment="Left" Margin="300,6,0,0" Name="StackPanel5" VerticalAlignment="Top" Width="285"
                             DataContext="{Binding Source={StaticResource DetailViewPagos}}">
    <StackPanel.Resources>
        <local:ProductToGenderConverter x:Key="prodtogenderconv"/>
    </StackPanel.Resources>

    <ComboBox Height="23" Name="ComboBox2" Width="120" IsEditable="False"
        ItemsSource="{Binding Source={StaticResource ProductLookup}}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
             <TextBlock Text="{Binding Converter={StaticResource prodtogenderconv}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
    </ComboBox>

public class ProductToGenderConverter : IValueConverter {

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

        MyProduct prod = value as MyProduct;

        if (prod is for a male) // Pseudocode for condition
            return "male";

        if (prod is for a female) // Pseudocode for condition
            return "female";

        return null or "";
    }

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

Alternatively you could provide a ViewModel which wraps your Product object, which has a specific property that indicates the "genderness" of the Product...then create a collection of those objects for setting in your ComboBox...then you can use DisplayMemberPath to point to that property.

Upvotes: 3

benPearce
benPearce

Reputation: 38333

Please see this answer, it is a way to wrap your values for nice binding and display in WPF.

The Item class could be modified to support object for the Code property.

Upvotes: 0

Related Questions