2
votes

I have little problem with databinding in my current project. I have an ObservableCollection I want to bind to an ListBox.

public ObservableCollection<GeoDataContainer> geoList = new ObservableCollection<GeoDataContainer>();

...later...

geoListBox.ItemsSource = geoList;

This code works fine. The Listbox has a datatemplate and everything looks perfect.

But I don't want to use C# code for binding. I want to make the binding in the XAML Code. I am searching for days but I don't get it. These are two lines C# code but to archive this in XAML it seems impossible without creating my own class for my collection or adding a DataProvider or resources or whatever.

Is there no easy way to do it?

3

3 Answers

4
votes

All you have to do is expose the collection and bind to it. For example, if you expose it as:

public ICollection<GeoDataContainer> GeoList
{
    get { return geoList; }
}

You will be able to bind to it as:

<ListBox ItemsSource="{Binding GeoList}"/>

The "trick" is to make sure that the DataContext of the ListBox is the class that exposes the GeoList property.

1
votes

Another good way would be instantiating geoList as a resource

<WindowResources>
  <l:GeoCollection x:Key="geoList"/>
</WindowResources>

Then you have

GeoCollection geoList = FindResource("geoList") as GeoCollection;

Of course, this is for cases when the data is related to the view only. If this is related to model or modelview, you use DataContext and bind to its properties.

0
votes

Kent suggestion is the way to go...

On a further note, if you do not wish to set your DataContext to the list, you can also retrieve the property with an another form of binding:

Make sure your root control has a name, i.e. "Root"

{Binding ElementName=Root, Path=GeoList}