加载时如何显示“加载”gif而不是wpf控制器?

时间:2017-06-21 08:02:25

标签: wpf xaml fallback

考虑wpf中的TextBlock,该get与viewmodel中的属性异步绑定,其中Fallback使用耗时的方法。使用xaml代码中的Text标记,我可以将TextBlock的{​​{1}}标记设置为“正在加载...”。

但我实际上有ListBox绑定到IEnumerable<MyType>,其中列表框项目显示MyType的不同字段。如何在加载有界IEnumerable<MyType>时显示一个laoding gif(或任何类型的不同wpf元素)?

我想我可以将Loading元素的Visibility绑定到某种描述异步属性状态的bool,但我在xaml中找不到这样的bool。如果它在xaml中不存在,我可以计算出加载方法的状态并在viewmodel中创建这个bool。这是实现它的最佳方式吗?

2 个答案:

答案 0 :(得分:2)

根据ItemsSource的状态,您可以更改ControlTemplate

<ListBox ItemsSource="{Binding Items}">
    <ListBox.Style>
        <Style TargetType="ListBox">
            <Style.Triggers>
                <Trigger Property="ItemsSource" Value="{x:Null}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBox">
                                <Image Source="LoadingImage.png"/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.Style>
</ListBox>

答案 1 :(得分:1)

您应该阅读@Stephen Cleary关于异步MVVM应用程序模式的文章:https://msdn.microsoft.com/en-us/magazine/dn605875.aspx

您可以绑定到NotifyTaskCompletion<IEnumerable<MyType>>源属性并使用DataTrigger或对IsNotCompleted属性的简单绑定来显示Image,直到Result属性已设置:

<!-- Busy indicator -->
<Image Source="pic.png" Visibility="{Binding YourItemsSourceProperty.IsNotCompleted,
            Converter={StaticResource BooleanToVisibilityConverter}}"/>
<!-- Results -->
<ItemsControl ItemsSource="{Binding YourItemsSourceProperty.Result}" Visibility="{Binding
          UrlByteCount.IsSuccessfullyCompleted, Converter={StaticResource BooleanToVisibilityConverter}}"/>

请阅读文章,了解有关“不做”和“不要”的更多信息。