Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新打开Silverlight AutoCompleteBox弹出窗口,无需重新加载来自webservice的建议_C#_Silverlight_Autocomplete - Fatal编程技术网

C# 重新打开Silverlight AutoCompleteBox弹出窗口,无需重新加载来自webservice的建议

C# 重新打开Silverlight AutoCompleteBox弹出窗口,无需重新加载来自webservice的建议,c#,silverlight,autocomplete,C#,Silverlight,Autocomplete,我有一个绑定到ObservableCollection ItemsSource的自动完成框,我通过从domainservice查询实体来自己过滤它。 我使用了从Jeff Wilcox博客的webservice调用进行填充的场景,方法是将PopulatingEventArgs.Cancel设置为True,当我的集合准备就绪时,我在ACB上调用PopulateComplete() 我的目标是在鼠标悬停(或单击)时重新打开下拉列表,但不重新加载来自web的所有数据。我在stackoverflow上发现

我有一个绑定到ObservableCollection ItemsSource的自动完成框,我通过从domainservice查询实体来自己过滤它。 我使用了从Jeff Wilcox博客的webservice调用进行填充的场景,方法是将PopulatingEventArgs.Cancel设置为True,当我的集合准备就绪时,我在ACB上调用PopulateComplete()

我的目标是在鼠标悬停(或单击)时重新打开下拉列表,但不重新加载来自web的所有数据。我在stackoverflow上发现了一个问题,答案是将IsDropDownOpen设置为True。但在本例中,ACB填充再次启动,另一个调用转到webservice

当然,当用户开始输入时,应该再次进行过滤。 (例如,您键入“ric”,框中显示“rice”和“ricin”,您选择了rice,但您改变了主意,想从同一个集合中选择另一个,比如说“ricin”。在这种情况下,您的内存中已经有包含“ric”的建议,无需再次加载它们。)

我找到了另一种方法,不用设置IsDropDownOpen,只需调用PopulateComplete()方法。这和我想做的完全一样,但有一点失败:在我的ACB失去焦点后,下拉列表不会在鼠标上再次打开,而不是它应该打开的地方。即使我点击返回acb文本框


那么有没有解决方法,或者有人知道为什么PopulateComplete()只在ACB第一次拥有焦点时才重新打开下拉列表?或者这只是我的运气,调用这个方法会重新打开下拉列表,应该使用IsDropDownOpen属性(好吧,这只有在一些标志指示这是由我的鼠标在填充事件args之后触发的伪填充事件时才可能。取消我应该立即调用PopulateComplete。但是我不明白,如果这可能有效(还没有尝试),为什么不直接调用PopulateComplete)?

嗯,我用一个测试位尝试了IsDropDownOpen,几乎成功了:

private void FoodBox_MouseEnter(object sender, MouseEventArgs e)
    {            
        //FoodBox.PopulateComplete();  not working after acb loses focus...            

        testbit = true;
        FoodBox.IsDropDownOpen = true;        
    }
这里是重载填充方法(无需设置ItemsSource explicit,因为它绑定到ObservableCollection):

到目前为止,这一切都很好,请确保搜索不会启动,因为当(第一次)您将鼠标悬停并选择acb时,它会将testbit设置为true。 因此,我添加了另一个事件处理程序,它负责在用户每次在键盘上输入文本时将testbit设置为false,确保在用户修改SearchText后重新生成/重新加载建议,而不是在您从下拉列表中选择项时:

private void FoodBox_TextChanged(object sender, RoutedEventArgs e)
    {
        testbit = false;
    } 
我仍然不知道为什么在不将IsDropDownOpen设置为true的情况下调用PopulateComplete()是不够的,并且将其设置为true也会将下拉列表的打开延迟大约为MinimumPopulateDelay中指定的时间,但至少它提供了我想要的功能。(也许挖掘acb的来源可以回答这个疑问)


在基本acb中实现的这一功能可能会对控件的未来版本有所帮助。

好吧,我用测试位尝试了IsDropDownOpen,几乎成功了:

private void FoodBox_MouseEnter(object sender, MouseEventArgs e)
    {            
        //FoodBox.PopulateComplete();  not working after acb loses focus...            

        testbit = true;
        FoodBox.IsDropDownOpen = true;        
    }
这里是重载填充方法(无需设置ItemsSource explicit,因为它绑定到ObservableCollection):

到目前为止,这一切都很好,请确保搜索不会启动,因为当(第一次)您将鼠标悬停并选择acb时,它会将testbit设置为true。 因此,我添加了另一个事件处理程序,它负责在用户每次在键盘上输入文本时将testbit设置为false,确保在用户修改SearchText后重新生成/重新加载建议,而不是在您从下拉列表中选择项时:

private void FoodBox_TextChanged(object sender, RoutedEventArgs e)
    {
        testbit = false;
    } 
我仍然不知道为什么在不将IsDropDownOpen设置为true的情况下调用PopulateComplete()是不够的,并且将其设置为true也会将下拉列表的打开延迟大约为MinimumPopulateDelay中指定的时间,但至少它提供了我想要的功能。(也许挖掘acb的来源可以回答这个疑问)

在基本acb中实现的这一功能可能会在控件的未来版本中有所帮助