ioWint
ioWint

Reputation: 1619

WPF Databinding combobox to a list<string>

I am having a difficult time trying to bind my property which is of type List to my combobox through XAML.

public List<string> MyProperty  { get; set; }

The following XAML binding does not work:

<ComboBox Name="cboDomainNames" ItemsSource="{Binding Path=MyProperty}"/> 

But the following assignment:

cboDomainNames.ItemsSource = MyProperty;

works perfectly. What i am missing here?

Upvotes: 14

Views: 58829

Answers (3)

Youp Bernoulli
Youp Bernoulli

Reputation: 5655

Assume you have a List<Foo> called Foos in your window / page. Foo has a property Name. Now you set up the binding in XAML as follows:

<ComboBox ItemsSource="{Binding Path=Foos}"
DisplayMemberPath="Name"
SelectedValuePath="Name"
SelectedValue="{Binding Path=Foo}"
/>

This is based on this SO question. Read this (WPF DataBinding overview) as a good foundation for databinding in WPF.

Upvotes: 7

Mario Vernari
Mario Vernari

Reputation: 7304

If you don't specify anything than just the path, the binding assumes as a source the container DataContext. By the way, the useful property is defined on the container (e.g. the window).

You may solve it as follows (in the xaml):

ItemsSource="{Binding Path=MyProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"

Upvotes: 0

ioWint
ioWint

Reputation: 1619

Posting my comment back to mark the answer.

My DataContext was set, BUT it was set after InitializeComponent(). I thought that could be the problem. Then I realized that as I am binding through xaml, when the view loads, the binding happens to the property which is empty.

The property gets populated when the view is ready after its loaded (i.e on _presenter.OnViewReady()). Since it's not an observable collection nothing gets added to the combobox. Specifying it from my code behind works, because at that time the data exists in the property.

Upvotes: 10

Related Questions