【问题标题】:how to bind AutoCompleteBox to a non-static List in windows phone如何将 AutoCompleteBox 绑定到 Windows Phone 中的非静态列表
【发布时间】:2011-07-28 13:49:13
【问题描述】:

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

这就是我的 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 不能以动态方式使用吗?

【问题讨论】:

    标签: windows-phone autocompletebox


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我有一个包含 10,000 个字符串的列表(我还有更多),您是说实际加载 10,000 个字符串并将其绑定到 AutoCompleteBox 吗?加载 10,000 个字符串需要多长时间?这需要多少内存?如果我们可以检测用户输入的内容,执行后台过滤过程,为 UI 提供一个新的(更短的)列表,那不是更有效吗?我想我理解这个 AutoCompleteBox 不像你的 AJAX 自动完成小部件那样动态。如果没有,我就不会使用它,因为它不会工作,但对于微不足道的情况并且不会扩展。
    • 100*100 = 10000。它在模拟器和真实设备上都是即时的。 (实际上,在真实设备上更快。)。而且我已经指出,它具有动态绑定的能力(因此我告诉你重新编程它的原因)。但是不一次获取所有数据的整个想法是愚蠢的。在手机上,一次获取所有内容几乎总是更好的性能。有了 32 GB 内存,您不必担心 0.5 兆字节的字符串。
    • 我得到了 SqliteSyntaxException:内存不足,我试图从一个表中只获取 1,000 个字符串(在模拟器上)。我的 sql 是:从 mytable 中选择名称,而 mytable 有 3 列(id 整数、名称文本、secondName 文本)。这是使用 sqlite 作为数据库。我猜这是一个“sqlite”问题?
    • 绝对是一个 sqllite 问题。我的应用程序可以毫无问题地将更大的数据数据库从 XML 或 JSON 文件加载到内存中。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多