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