重新打开Silverlight AutoCompleteBox弹出框,而不重新加载来自webservice的建议

本文关键字:加载 webservice 新加载 AutoCompleteBox Silverlight 新打开 | 更新日期: 2023-09-27 18:13:48

我有一个AutoCompleteBox绑定到一个ObservableCollection ItemsSource,我通过从domainservice查询实体来过滤自己。通过设置PopulatingEventArgs,我使用了从Jeff Wilcox博客的web服务调用进行填充的场景。取消为True,当我的集合准备好时,我调用ACB上的PopulateComplete()。

我的目标是重新打开下拉菜单上的鼠标悬停(或点击),但没有重新加载从网络上的所有数据。我在stackoverflow上发现了一个问题,答案是将IsDropDownOpen设置为True。但是在这种情况下,ACB填充再次开始,另一个调用进入webservice。

当然,当用户开始输入时,应该再次进行过滤。(例如,你输入"ric",框提示"大米"answers"蓖麻毒素",你选择了大米,但你改变了主意,想从同一系列中选择另一种,比如"蓖麻毒素"。在这种情况下,您已经在内存中有包含"ric"的建议,不需要再次加载它们..)

我发现了另一种方法,而不是设置IsDropDownOpen,我只是简单地调用PopulateComplete()方法。这与我想要的完全相同,但有一点失败:在我的ACB失去焦点后,下拉菜单不会像鼠标一样再次打开。即使当我点击返回到acb文本框

所以有一个修复这个,或者有人知道为什么PopulateComplete()只重新打开下拉菜单时,ACB有焦点的第一次?或者这只是我的运气,调用这个方法重新打开下拉菜单和IsDropDownOpen属性应该使用(afaik这将只可能与一些标志,表明它是一个假的填充事件触发我的鼠标和PopulatingEventArgs之后。取消我应该立即调用populatcomplete。但我不明白,如果这可能工作(还没有尝试),为什么不调用简单的PopulateComplete)?

重新打开Silverlight AutoCompleteBox弹出框,而不重新加载来自webservice的建议

嗯,我尝试了一个测试位的IsDropDownOpen,并且几乎工作:

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

这是重载的填充方法(不需要显式设置ItemsSource,因为它绑定到一个ObservableCollection):

public void FoodBox_Populating(object sender, PopulatingEventArgs e)
    {
        e.Cancel = true;            
        if (!testbit)
        {
            VM.LoadFoodSuggestions(FoodBox.SearchText);
        }
        else
        {
            testbit = false;
            FoodBox.PopulateComplete();
        } 
    }

到目前为止,这工作得很好,除了搜索没有开始,因为当(第一次)您将鼠标移到并选择acb时,它将testbit设置为true。因此,我添加了另一个事件处理程序,负责在每次用户在键盘上输入文本时将testbit设置为false,确保在用户修改SearchText后重新生成/重新加载建议,但当您从下拉菜单中选择项时则不会:

private void FoodBox_TextChanged(object sender, RoutedEventArgs e)
    {
        testbit = false;
    } 

我仍然不知道为什么调用PopulateComplete()是不够的,没有将IsDropDownOpen设置为Ture,并将其设置为true,也延迟了下拉菜单打开大约与MinimumPopulateDelay指定的时间,但至少它给了我我想要的功能。(也许深入研究acb的来源可以解开这个谜团)

也许这个在基本控件中实现的功能在将来的控件版本中会有帮助。