如何绑定到DataTemplate中的ItemsSource?

时间:2011-10-17 16:17:40

标签: silverlight data-binding datatemplate

在我的Silverlight 4应用程序中,我想使用Silverlight Toolkit中的AutoCompleteBox。我在列表框中使用此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“}这样的东西,但这意味着我需要创建这个列表作为绑定到列表的对象类的属性,这将是一个很大的开销。 / p>

提前致谢,
弗兰克

4 个答案:

答案 0 :(得分:1)

我订阅了AutoCompleteBox的GotFocus-Event并将列表绑定在那里。感谢Nathan和Shelby让我朝着正确的方向前进!

答案 1 :(得分:0)

您应该能够通过在代码中引用列表框来遍历树:

(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。如果您有其他嵌入式元素,则需要进行转换并尝试获取该元素的容器属性,以继续向下进入模板。

答案 2 :(得分:0)

试试这个。这对我来说已经十几次了。

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

当然,如果列表框模板中只有一个AutoCompleteBox,如果它首先出现,那么试试,

  FirstOrDefault();

在您的查询结束时。

如果您还有其他需要,请告诉我。

答案 3 :(得分:0)

您可以在其ItemsSource事件的处理程序中设置AutoCompleteBox的{​​{1}}属性(您将获得Loaded本身作为发件人< / strong>事件)。

XAML:

AutoCompleteBox
代码背后的代码:

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

希望这有帮助