键盘在Xamarin.Forms搜索栏上冻结

时间:2015-12-28 20:06:07

标签: c# xaml data-binding async-await xamarin.forms

我有一个自定义实现的控件,它非常占用内存(它基本上为每个组显示一个组头和一个accordionControl)。 CustomControls AccordionControlGrouping和AccordionControl都继承自StackLayout,因此我实现了自己的可绑定ItemsSource。当ItemsSource更改时,我会主动更改控件的视图。 我现在已经优化了这个变化(使用LINQ和BinarySearch以及那些东西)从5秒开始。每次搜索到0.8秒。

这本身并不是问题,但每次用户输入密钥时,键盘会冻结,因此搜索非常不便。

我的SearchBar绑定了像这样的ViewModel的命令

<SearchBar x:Name="EventSearchBar"
             Text="{Binding SearchText}"
             SearchCommand="{Binding SearchCommand}"
             Placeholder="Suche"/>

SearchCommand

private Xamarin.Forms.Command _searchCommand;
public System.Windows.Input.ICommand SearchCommand
{
    get
    {
        _searchCommand = _searchCommand ?? new Xamarin.Forms.Command(UpdateAccordionControlGrouping, CanExecuteSearchCommand);
        return _searchCommand;
    }
}
private bool CanExecuteSearchCommand()
{
    return true;
}

SearchText属性

private string _searchText = string.Empty;
public string SearchText
{
    get { return _searchText; }
    set
    {
        if (_searchText != value)
        {
            _searchText = value ?? string.Empty;
            RaisePropertyChanged(nameof(SearchText));

            // Perform the search
            if (SearchCommand.CanExecute(null))
                SearchCommand.Execute(null);
        }
    }
}

UpdateAccordionControlGrouping

private void UpdateAccordionControlGrouping()
{
  // Do some LINQ stuff to group and filter a global collection of data.
  // And raise the #OnPropertyChanged event for the ItemsSource of my 
  // custom control.
}

现在如何让整个过程异步?

我已经调查了this article,但它对我没用。

1 个答案:

答案 0 :(得分:0)

要运行方法'UpdateAccordionControlGrouping()'异步,您可以这样做:

private async Task UpdateAccordionControlGrouping()
{
    var newgrouping = await Task.Run(() => 
        {
            //do CPU bound work here
            return newgrouping;
        });
   // assign newgrouping to the correct control
}

请注意,如果您需要更改视图中的任何数据(Bindings等),您可能会遇到CrossThreadException。您需要使用Dispatcher,如下所示:Dispatcher.Dispatch on the UI thread

如果您使用MvvmLight,则可以使用DispatchHelper Simple example of DispatcherHelper