在我的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>
提前致谢,
弗兰克
答案 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"/>
希望这有帮助