Привязка данных Silverlight 4: привязка к ObservableCollection <string>больше не работает - PullRequest
0 голосов
/ 21 апреля 2010

Обновление с SL3 -> SL4.Первая проблема: это вызывает исключение синтаксического анализатора:

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

Коллекция равна ObservableCollection<string>.Работал нормально в SL3.Так что кажется, что SL4 не разрешает привязку к свойству Name.Да?

Итак: изменилось на

<StackPanel Tag={Binding} />

... так как мне просто нужно идентифицировать элемент управления в коде позади.Итак, вот ошибка (потому что это должно быть ошибкой!):

В этом фрагменте 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>

В коде, который я используюрекурсивная функция для поиска объекта Dependency с предоставленным свойством Name или Tag:

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

ОК, получите это: в коде позади я могу получить элемент управления ORDERED FIRST в XAML!Другими словами, если я сначала поставлю CheckBox, я смогу получить CheckBox, но без StackPanel.И наоборот.Все это работало нормально в SL3.

Любая помощь, идеи ...?

Спасибо - Курт

1 Ответ

0 голосов
/ 22 апреля 2010

Это не ошибка.

Ваш цикл никогда не пройдет мимо первого объекта, потому что вы возвращаете дочерний элемент при первом совпадении.

Добавьте его в коллекцию и вместо этого верните коллекцию.

Примерно так:

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

EDIT: Это, конечно, гарантируется, что вы не вызываете свой код несколько раз, используя дочерний элемент return. В этом случае вы должны предоставить код вызывающего метода, чтобы мы могли видеть, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...