[英]Caliburn.Micro BindableCollection is not updating in View code using code behind to set up bindings
[英]Using async/await but UI still hangs using Caliburn.Micro BindableCollection AddRange
我遇到了一个问题,即我的UI在一秒左右时间内没有响应,我猜它的Async / Await技能还没有升级到最新版本。
它是使用Caliburn Micro Framework的WPF应用程序。 我发现sofer的是,我的UI在搜索程序包(Nuget.Core)时是响应的,并且当任务返回时带有绑定的元素列表及其在可绑定集合中占主导的AddRange。 (它的Feed中最多包含5个元素,因此我不明白为什么要将这几个元素放入集合中要花更多的时间才能完成。
protected override async void OnActivate()
{
base.OnActivate();
this.PropertyChanged += PluginManagerViewModel_PropertyChanged;
IsBusy = true;
var list = await SearchPackages();
this.Packages.AddRange(list);
IsBusy = false;
}
async void PluginManagerViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "SelectedVersion":
case "SelectedSortBy":
var list= await SearchPackages();
this.Packages.AddRange(list);
break;
default:
break;
}
}
public BindableCollection<IPackage> Packages { get; set; }
private Task<IEnumerable<IPackage>> SearchPackages()
{
return Task.Run(() =>
SelectedSortBy.OrderBy(
(_manager.SourceRepository
.Search("", SelectedVersion != "Stable")))
.AsEnumerable()
.Where(PackageExtensions.IsListed));
}
这是列表视图:
<ListView ScrollViewer.PanningMode="VerticalFirst"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.PanningRatio="0.5"
x:Name="Packages">
<ListView.ItemTemplate>
<DataTemplate>
<Grid cal:Bind.Model="{Binding}">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="Description" Grid.Column="1" Margin="10,27.96,136,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="62.04"/>
<TextBlock x:Name="Title" TextWrapping="Wrap" VerticalAlignment="Top" FontWeight="Bold" Grid.Column="1" Margin="10,10,136,0"/>
<Button Content="Install" HorizontalAlignment="Right" VerticalAlignment="Top" Width="121" Grid.Column="1" Margin="0,10,10,0"/>
<TextBlock Grid.Column="1" x:Name="Version" HorizontalAlignment="Right" Margin="0,32.96,10,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextAlignment="Right" FontWeight="Bold"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这不是一个完美的解决方案,但我的UI至少可以再次响应。
private async Task UpdatePackagesCollection()
{
IsBusy = true;
var list = await SearchPackages().ConfigureAwait(false);
this.Packages.Clear();
IsBusy = false;
foreach (var p in list)
{
await App.Current.Dispatcher.InvokeAsync(() =>
{
Packages.Add(p);
}, DispatcherPriority.ContextIdle);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.