当IsAsync绑定繁忙时,我想要一个沙漏;可能的



我目前有这样的XAML代码:

<ListView Name="fileLV" SelectionMode="Extended" ItemsSource="{Binding path=DataContext.SelectedAsset.Files,ElementName=selectionView,IsAsync=True}"/>

"Files"属性需要15秒才能返回。用户一直在想发生了什么。我看到了一些其他代码来显示回退值或使用多个绑定,但这些代码并不意味着"别管这个控件",就像沙漏一样。

我想要的是能够命名一个绑定,然后将一些其他属性绑定到该绑定的IsBusy属性。我想要一个触发器来在绑定繁忙时更改列表视图上的光标。现有的WPF框架对此有帮助吗?

我不知道有任何内置开箱即用解决方案,但肯定有一些方法可以让它带来良好的体验。我会给你一个我将如何构建这个的快速想法,如果你需要,我也可以想出代码:

  1. 创建一个"LoadingItem"DataTemplate,它将显示某种进度条作为您的列表中的一个项目

  2. 创建一个"DataTemplateSelector"以在LoadingItem之间切换以及您列表中的RegularItem。

  3. 在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);
        }
    }

最新更新