我有一个自定义实现的控件,它非常占用内存(它基本上为每个组显示一个组头和一个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,但它对我没用。
答案 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