1

我正在使用 WP7 Silverlight Toolkit 中的 AutoCompleteBox。我已经看到了将字符串的静态列表(不变列表)绑定到 AutoCompleteBox 的示例。但是,是否有一个示例显示如何以更动态的方式绑定 AutoCompleteBox?我在下面的尝试不断抛出 InvalidOperationException: Cannot change ObservableCollection during CollectionChanged 或 PropertyChanged 事件。

这就是我的 xaml 中的内容。

<toolkit:AutoCompleteBox x:Name="tbQuery" TextChanged="tbQuery_TextChanged" />

在我的代码隐藏中,我模拟了如下访问数据库或跨网络。

    private void tbQuery_TextChanged(object sender, RoutedEventArgs e)
    {
        AutoCompleteBox acBox = sender as AutoCompleteBox;
        string txt = acBox.Text;
        if (txt.Length > 0)
        {
            //exception thrown below here;
            //_words is of type ObservableCollection<string>
            //earlier, acBox.ItemsSource was set to _words
            _words.Clear();
            _words.Add(txt + "a");
            _words.Add(txt + "b");
            _words.Add(txt + "c");
        }
    }

我也尝试过类似下面的方法,但效果不佳。抛出相同的 InvalidOperationException。

    private void tbQuery_TextChanged(object sender, RoutedEventArgs e)
    {
        AutoCompleteBox acBox = sender as AutoCompleteBox;
        string txt = acBox.Text;
        if (txt.Length > 0)
        {
            List<string> list = new List<string>();
            list.Add(txt + "a");
            list.Add(txt + "b");
            list.Add(txt + "c");
            //exception thrown below here;
            acBox.ItemsSource = list;
        }
    }

工具包中的演示仅显示使用静态资源,大多数示例仅显示使用静态列表。这是因为 AutoCompleteBox 不能以动态方式使用吗?

4

2 回答 2

1

即时更改列表的意义何在?自动完成框会自动从给定的 itemssource 中过滤您的列表。

无论如何,在 AutoCompleteBox 尝试过滤掉您的项目之后,首先调用 TextChanged 。如果您在输入几个字符后按下返回按钮,您将看到建议的生成项目。

您很可能将 AutoCompleteBox 重新编程为您的功能(它是开源的),但我认为如果您解释您的目的会更好,因此我们可以提供更好的建议。

于 2011-07-28T17:27:43.700 回答
0

好吧,您实际上不需要重新编程 AutoCompleteBox。您可以处理 Populating 事件以将 AutoCompleteBox 链接到动态生成的数据。

就是你要找的。这是一篇很好的文章,有一个很好的例子。如前所述,不要忘记在手动填充操作完成时调用 PopulateComplete()。

您还可以将 ItemFilter 属性设置为自定义过滤器,以定义您自己的搜索逻辑。有关详细信息,请参阅。请记住将 FilterMode 设置为自定义。

于 2016-01-08T17:36:21.577 回答