Silverlight 4 DataBinding:绑定到ObservableCollection <string>不再工作</string>

时间:2010-04-20 21:52:37

标签: silverlight data-binding

从SL3升级 - &gt; SL4。第一个问题:这会引发解析器异常:

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

收集是ObservableCollection<string>。在SL3中工作得很好。所以似乎SL4不允许绑定到Name属性。咦?

所以:改为

<StackPanel Tag={Binding} />

...因为我只需要在后面的代码中识别控件。所以这就是错误('因为这必须是一个错误!):

在此frag中,AllAvailableItems是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>

在后面的代码中,我使用递归函数来查找提供了Name或Tag属性的Dependency对象:

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;
    }

好的,得到这个:在后面的代码中,我可以获得XAML中第一个ORDERED的控件!换句话说,如果我先放置CheckBox,我可以检索CheckBox,但不能检索StackPanel。反之亦然。这一切在SL3中都运行良好。

任何帮助,想法......?

谢谢 - 库尔特

1 个答案:

答案 0 :(得分:0)

这不是错误。

您的循环永远不会超过第一个对象,因为您在第一次匹配时返回该孩子。

将其添加到集合中,然后返回集合。

像这样:

public static IEnumerable<T> FindVisualChildrenByName<T>(DependencyObject parent, string name, DependencyProperty propToUse) where T : DependencyObject
{
  List<T> children = new List<T>();
  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)
    {
      children.add(child as T);
    }
   // ...
  }
  return children;
}

修改 当然,这被授予您不使用return子元素多次调用代码。在这种情况下,您应该提供调用方法代码,以便我们可以看到您正在做什么。