Как привязать к ItemsSource в DataTemplate? - PullRequest
2 голосов
/ 17 октября 2011

в моем приложении Silverlight 4 я хочу использовать AutoCompleteBox из набора инструментов Silverlight.Я использую этот AutoCompleteBox в списке, элементы которого определены в DataTemplate

<ListBox x:Name="ListBoxCharacteristics">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid Background="{StaticResource SolidBrushVeryLightGrey}">
        <sdk:AutoCompleteBox Text="{Binding Name, FallbackValue=[None], Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" IsTextCompletionEnabled="True"/>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Чтобы предоставить предлагаемые элементы AutoCompleteBox, мне нужно связать его со свойством ItemsSource.Идея состояла в том, чтобы создать список в конструкторе и затем связать его с AutoCompleteBox.Но AutoCompleteBox находится только в DataTemplate, поэтому я не могу ссылаться на него напрямую.

Есть идеи, как этого добиться?Я подумал о чем-то вроде "ItemsSource =" {Binding SuggestionList "}, но это означало бы, что мне нужно будет создать этот список в качестве свойства для класса объектов, которые я связываю со списком, что было бы большими накладными расходами.

Заранее спасибо,
Фрэнк

Ответы [ 4 ]

1 голос
/ 18 октября 2011

Я подписался на GotFocus-Event AutoCompleteBox и привязал список там. Спасибо Натану и Шелби за то, что они направили мою голову в правильном направлении!

0 голосов
/ 18 октября 2011

Вы можете установить свойство ItemsSource AutoCompleteBox в обработчике его события Loaded (вы сами получите AutoCompleteBox в качестве отправителя события).

XAML:

<sdk:AutoCompleteBox ...
                     Loaded="autoCompleteBox_Loaded"/>

код позади:

private void autoCompleteBox_Loaded(object sender, RoutedEventArgs e)
{
    var autoCompleteBox = sender as AutoCompleteBox;
    autoCompleteBox.ItemsSource = SuggestionList; //the list you want to bind to
}

Надеюсь, это поможет

0 голосов
/ 18 октября 2011

попробуйте это. Это сработало для меня десятки раз.

 AutoCompleteBox autoComplete = Listbox.ItemTemplate.GetVisualDescendants().OfType<AutoCompleteBox>().SingleOrDefault();
 autoComplete.ItemsSource = theListYouHavePopulated;

то есть, конечно, если в шаблоне списка есть только один AutoCompleteBox, если он идет первым, попробуйте

  FirstOrDefault();

в конце вашего запроса.

Дайте мне знать, если вам нужно что-нибудь еще.

0 голосов
/ 17 октября 2011

Вы должны иметь возможность пройти по дереву, ссылаясь на список в коде, например:

(ListBoxCharacteristics.ItemTemplate.VisualTree as AutoCompleteBox).ItemSource = your_new_list;

, но вам лучше создать Binding в этом конструкторе:

Binding B = new Binding();
B.Mode = BindingMode.TwoWay;
B.NotifyOnValidationErrors = true;
B.FallbackValue = "[None]"; // not sure about this one
B.ValidatesOnExceptions = true;
B.Source = your_new_list;

(ListBoxCharacteristics.ItemTemplate.VisualTree as AutoCompleteBox).SetBinding(AutoCompleteBox.TextProperty, B);

ListBoxCharacteristics.ItemTemplate.VisualTree должен предоставить вам корневой узел вашего ItemsTemplate, и вы сможете привести этот объект к вашему AutoCompleteBox.Если у вас есть дополнительные встраиваемые элементы, вы захотите привести их к типу контейнера и попытаться получить свойство контейнера для этого элемента, чтобы продолжить работу в шаблоне.

...