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

时间:2012-03-22 15:36:00

标签: c# wpf xaml binding

我目前有这样的XAML代码:

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

“Files”属性需要15秒才能返回。用户一直想知道发生了什么事。我已经看到一些其他代码来显示回退值或者使用多个绑定,但那些并不依赖于“将此控件单独保留”,就像沙漏超过该控件所暗示的那样。

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

3 个答案:

答案 0 :(得分:0)

我不知道任何内置开箱即用的解决方案,但确实有办法让您获得愉快的体验它。 我会快速了解如何构建它,如果需要,我也可以提出代码:

  1. 创建一个&#34; LoadingItem&#34; DataTemplate将显示某种进度条作为列表中的项目

  2. 创建一个&#34; DataTemplateSelector&#34;在LoadingItem之间切换 和列表中的RegularItem。

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

答案 1 :(得分:0)

为此,请勿使用IsAsync。在Property上使用BackGroundWorker。首先返回带有“工作消息”的源,启动BackGroundWorker,然后在回调上提供真实源并调用NotifyPropertyChanged。你甚至可以有一个progess酒吧。

答案 2 :(得分:0)

我能够使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);
        }
    }