考虑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
。这是实现它的最佳方式吗?
答案 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}}"/>
请阅读文章,了解有关“不做”和“不要”的更多信息。