JubJub
JubJub

Reputation: 1515

Silverlight - Binding with ObservableCollections

This is no doubt a newbish question, but I have looked for an answer to no avail. My setup is simple: I have a ListBox control defined in XAML and an ObservableCollection<MyClass> in the same class. I am binding the ObservableCollection<MyClass> to the ListBox.

Within the hierarchy of this ListBox in XAML, I want to bind to a given MyClass object, not to a child property of the MyClass object.

To clarify, I have XAML that looks like the following (I bind the ObservableCollection in code):

  <ListBox x:Name="MyListBox">
    <ListBox.ItemTemplate>
     <DataTemplate>
      <MyControls:SpecialControl MyClassObj="{Binding !!!}" />
     </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>

Surely there is a way to get at the object of an ObservableCollection rather than being forced to bind to one of its child properties.

Upvotes: 1

Views: 10556

Answers (2)

dtb
dtb

Reputation: 217401

You do not have to specify a Path if you want to use the bound object itself:

<ListBox x:Name="MyListBox">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <MyControls:SpecialControl MyClassObj="{Binding}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

BTW: Instead of your custom property, you can use the DataContext property of your control to bind the control to the object:

<ListBox x:Name="MyListBox">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <MyControls:SpecialControl DataContext="{Binding}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Upvotes: 3

sipsorcery
sipsorcery

Reputation: 30734

As well as specifying the binding path in your XAML you have to bind your collection to the ListBox.

C#

ObservableCollection<MyClass> myCollection = new ObservableCollection<MyClass>();
MyListBox.DataContext = myCollection;

The XAML you have used won't be particularly useful unless you have overriden the ToString method on MyClass. Even though you say you're not are you sure it's not a property of MyClass that you want to bind to? I can't see why you'd want to bind directly to a collection object.

XAML

<ListBox x:Name="MyListBox">  
    <ListBox.ItemTemplate>    
        <DataTemplate>      
            <MyControls:SpecialControl MyClassObj="{Binding Path=MyClassProperty}" />    
        </DataTemplate>  
     </ListBox.ItemTemplate>
</ListBox>

Upvotes: 0

Related Questions