views:

3570

answers:

2

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.

+3  A: 

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>
dtb
Thanks! You seem to have read my mind in also suggesting I bind directly to DataContext. That never occurred to me, but it is exactly what I want to do.
JubJub
A: 

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>
sipwiz
The SpecialControl must bind properties of the object to some of its child elements. Perhaps I am doing this impropertly, but I don't see a better method if I want the SpecialControl to be autonomous.
JubJub