当IsAsync绑定繁忙时,我想要一个沙漏;可能的
本文关键字:一个 沙漏 绑定 IsAsync 我想要 | 更新日期: 2023-09-27 18:28:53
我目前有这样的XAML代码:
<ListView Name="fileLV" SelectionMode="Extended" ItemsSource="{Binding path=DataContext.SelectedAsset.Files,ElementName=selectionView,IsAsync=True}"/>
"Files"属性需要15秒才能返回。用户一直在想发生了什么。我看到了一些其他代码来显示回退值或使用多个绑定,但这些代码并不意味着"别管这个控件",就像沙漏一样。
我想要的是能够命名一个绑定,然后将一些其他属性绑定到该绑定的IsBusy属性。我想要一个触发器来在绑定繁忙时更改列表视图上的光标。现有的WPF框架对此有帮助吗?
我不知道有任何内置、开箱即用解决方案,但肯定有一些方法可以让它带来良好的体验。我会给你一个我将如何构建这个的快速想法,如果你需要,我也可以想出代码:
-
创建一个"LoadingItem"DataTemplate,它将显示某种进度条作为您的列表中的一个项目
-
创建一个"DataTemplateSelector"以在LoadingItem之间切换以及您列表中的RegularItem。
- 在Files属性中,清除集合并添加一个将显示为LoadingItem(取决于您如何构建DataTemplateSelector逻辑。启动另一个线程以扫描文件并在临时集合中填写返回结果(BackgroundWorker)。当方法返回时,您就在UI上线程,再次清除ItemsSource集合并填充它结果
为此,请不要使用IsAsync。在物业上使用BackGroundWorker。首先返回一个带有"工作消息"的源,启动BackGroundWorker,然后在回调中提供实际源并调用NotifyPropertyChanged。你甚至可以有一个proges酒吧。
我能够使DataTemplateSelector工作。需要注意的是,ListView的所有绑定都需要是可枚举的。在我的控制下,我添加了这样一个资源:
<UserControl.Resources>
<x:Array x:Key="LoadingTemplate" Type="DataTemplate">
<DataTemplate>...my daisy code...</DataTemplate></x:Array>...
然后我把我的装订改成这样:
<ListView.ItemsSource>
<PriorityBinding>
<Binding Path="DataContext.SelectedAsset.Files" ElementName="selectionView" IsAsync="True"/>
<Binding Source="{StaticResource LoadingTemplate}" />
</PriorityBinding>
</ListView.ItemsSource>
然后我安装了这个模板选择器:
public class OverridableDataTemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return item as DataTemplate ?? base.SelectTemplate(item, container);
}
}