Silverlight 4 DataBinding: Binding to ObservableCollection<string> not working anymore

Posted by Kurt on Stack Overflow See other posts from Stack Overflow or by Kurt
Published on 2010-04-20T21:52:37Z Indexed on 2010/04/22 5:23 UTC
Read the original article Hit count: 414

Filed under:
|

Upgrading from SL3 -> SL4. First problem: this throws a parser exception:

<StackPanel Name={Binding} /> (same with x:Name)

Collection is ObservableCollection<string>. Worked fine in SL3. So it seems that SL4 doen't allow binding to the Name property. Huh?

So: changed to

<StackPanel Tag={Binding} />

... since I just need to ID the control in code behind. So here's the bug ('cuz this has got to be a bug!):

In this frag, AllAvailableItems is an ObservableCollection<string>:

<ItemsControl Name="lbItems"
                  ItemsSource="{Binding AllAvailableItems}"
                  Height="Auto"
                  Width="Auto"
                  BorderBrush="Transparent"
                  BorderThickness="0"
                  VerticalAlignment="Top"
                  HorizontalAlignment="Left"
                  Margin="12,6,0,0">
        <ItemsControl.ItemTemplate>
            <DataTemplate>

                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <CheckBox Tag="{Binding}"
                              Checked="ItemChecked_Click"
                              Unchecked="ItemUnchecked_Click"
                              Style="{StaticResource CheckBoxStyle}"
                              Grid.Row="0">
                        <CheckBox.Content>
                            <TextBlock Text="{Binding}"
                                       Style="{StaticResource FormLJustStyle}" />
                        </CheckBox.Content>
                    </CheckBox>

                    <StackPanel Tag="{Binding}"
                                Orientation="Vertical"
                                Grid.Row="1">
                        <configControls:ucLanguage /> <!-- simple user control -->
                    </StackPanel>

                </Grid>

            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

In the code behind, I use a recursive function to find the Dependency object with either the Name or Tag property provided:

public static T FindVisualChildByName<T>(DependencyObject parent, string name, DependencyProperty propToUse) where T : DependencyObject
    {
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
      {
        var child = VisualTreeHelper.GetChild(parent, i);
        string controlName = child.GetValue(propToUse) as string;
        if (controlName == name)
        {
          return child as T;
        }
        else
        {
          T result = FindVisualChildByName<T>(child, name, propToUse);
          if (result != null)
            return result;
        }
      }
      return null;
    }

OK, get this: in the code behind, I can get the control that is ORDERED FIRST in the XAML! In other words, if I put the CheckBox first, I can retrieve the CheckBox, but no StackPanel. And vice-versa. This all worked fine in SL3.

Any help, ideas ... ?

Thanks - Kurt

© Stack Overflow or respective owner

Related posts about Silverlight

Related posts about databinding