Edward Tanguay
Edward Tanguay

Reputation: 193302

WPF: ComboBox displays "(namespace).(classname)" instead of data

I want to get my ComboBox in XAML to bind to my List collection of custom objects in code behind.

Currently the ComboBox lists for each entry dpwpf.Contact which is my {namespace}.{classname}.

What do I need to put in the XAML to tell it to list out, e.g. LastName + FirstName?

I know it's something like {Binding Path=... Value=...} but I can't get it.

XAML:

<Window x:Class="dpwpf.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <StackPanel>
            <TextBlock Text="Select the contact:"/>
            <ComboBox Name="theContactList"/>
        </StackPanel>
    </StackPanel>
</Window>

Code Behind:

namespace dpwpf
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            StoreDB db = new StoreDB();
            List<Contact> contacts = db.GetContacts()
            theContactList.ItemsSource = contacts.ToList();
        }
    }
}

Answer:

<Window x:Class="dpwpf.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    xmlns:local="clr-namespace:dpwpf">

    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Contact}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding LastName}"/>
                <TextBlock Text=" "/>
                <TextBlock Text="{Binding FirstName}"/>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

    <StackPanel>
        <StackPanel Margin="10">
            <TextBlock Text="Contact Name:" Foreground="#555"/>
            <TextBox Name="theName"/>
        </StackPanel>
        <StackPanel>
            <TextBlock Text="Select the contact:"/>
            <ComboBox Name="theContactList"/>
        </StackPanel>
    </StackPanel>
</Window>

Upvotes: 12

Views: 10881

Answers (4)

Cameron MacFarland
Cameron MacFarland

Reputation: 71856

You can override the ToString method of Contact, or you can define a DataTemplate in WPF.

xmlns:dpwpf="... namespace of dpwpf"

<Window.Resources>
    <DataTemplate DataType="{x:Type dpwpf:Contact}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding LastName}">
            <TextBlock Text=" ">
            <TextBlock Text="{Binding FirstName}">
        </StackPanel>
    </DataTemplate>
</Window.Resources>

This allows you to define how a Contact object will appear anywhere in the window. If you want to limit this to the ComboBox you can add the DataTemplate just to the ComboBox resources.

Upvotes: 10

Rafa
Rafa

Reputation: 71

Just add this in you ComboBox tag (xaml code)

TextSearch.TextPath ="Title"

ToString() modification affects all future cases you need it, I don't recommend you to do that.

See that example: http://simplesample.site90.com/wpf_combobox.php

Upvotes: 7

Ray Booysen
Ray Booysen

Reputation: 30021

What the binding mechanism is doing is calling ToString() on the type that is being bound. Because I guess you're not overriding ToString() it'll just so the namespace.type instead of something useful.

As rebelious says, you can use DisplayMember to tell the binding to use a property of that name for the display value or you can override ToString() as below to get your custom property to show.

public void Contact
{
 public string FirstName { get; set; }
 public override string ToString()
 {
   return FirstName; 
 }
}

Upvotes: 6

user61477
user61477

Reputation: 182

you need to use DisplayMember="TheValue"

you can add this in the XAML or in the CLR also note your binding in cose and not through the XAML. i think this relates to a prvious question of yours. which implements the binding through ObjectDataProvider use that example and add the DisplayMemeber="memeber" in the XAML

HTH, Eric,

Upvotes: 3

Related Questions