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

C# 当我的IsAsync绑定忙时,我想要一个沙漏;可能的,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我目前有如下XAML代码: <ListView Name="fileLV" SelectionMode="Extended" ItemsSource="{Binding path=DataContext.SelectedAsset.Files,ElementName=selectionView,IsAsync=True}"/> <UserControl.Resources> <x:Array x:Key="LoadingTemplate" Type

我目前有如下XAML代码:

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

“Files”属性需要15秒才能返回。用户一直在想到底发生了什么。我见过一些其他代码显示回退值或使用多个绑定,但这些代码并不依赖于暗示“不要使用此控件”,就像该控件上的沙漏暗示的那样

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

我不知道有什么内置的、现成的解决方案,但肯定有办法让您体验一下。 我将快速告诉您我将如何构建它,如果您需要,我也可以提供代码:

  • 创建一个“LoadingItem”数据模板,将某种进度条显示为列表中的一项

  • 创建“DataTemplateSelector”以在LoadingItem之间切换 还有你名单上的规则

  • 在“文件”属性中,清除集合并添加 将显示为LoadingItem(取决于您如何构建 DataTemplateSelector逻辑。启动另一个线程以扫描文件 并在临时集合中填写返回结果 (BackgroundWorker)。当方法返回时,您位于UI上 再次线程,再次清除ItemsSource集合并填充它 结果如何

  • 为此,请不要使用IsAsync。在属性上使用BackGroundWorker。首先返回带有“工作消息”的源,启动BackGroundWorker,然后在回调上提供真实的源代码并调用NotifyPropertyChanged。您甚至可以有一个进程栏。

    我能够使DataTemplateSelector工作。需要注意的是,ListView的所有绑定都必须是可枚举的。在我的控件中,我添加了如下资源:

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

    我仔细研究了一下这个解决方案。我与它有一些冲突。首先,我喜欢我的Files属性的强类型返回。它实际上在很多地方使用。我不希望每个用户都必须分析返回的数据类型。不过,似乎我可以通过PriorityBinding实现类似的功能。如果它是DataTemplate,我想我会有一个选择器返回项;然后我会将该模板定义为静态资源,并将其绑定为第二优先级。为什么要解雇BackGroundWorker?可以在加载数据时禁用该控件。ProcessChanged比hour glass更具信息性-可以使用%comp更新它删除或删除文件数。使用优先级绑定,您无法禁用或显示真实状态消息。