如何在加载时显示“加载”gif而不是wpf控制器?
考虑wpf中的TextBlock
,它与视图模型中的属性异步绑定,其中get
使用耗时的方法。使用xaml代码中的Fallback
标记,我可以将TextBlock
的Text
标记设置为“正在加载...”。如何在加载时显示“加载”gif而不是wpf控制器?
但我实际上有一个ListBox
绑定到一个IEnumerable<MyType>
其中列表框项目显示不同的字段MyType
。如何在加载有界的IEnumerable<MyType>
时显示laoding gif(或任何类型的不同wpf元素)?
我想我可以将Loading元素的Visibility
绑定到某种描述异步属性状态的bool
,但我在xaml中找不到这样的bool。如果它在xaml中不存在,我可以计算加载方法的状态并在视图模型中创建此bool
。这是实现它的最好方法吗?
你应该阅读@Stephen克利的关于模式的异步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}}"/>
请阅读文章以了解更多信息关于做什么和不该做什么。
取决于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>
感谢这个答案grek40。你的意思是'Value =“{x:Null}”'是控制有界属性的“尚未加载”特征的标签吗? –
是的,在这个例子中,我假定'ItemsSource'在加载之前是'null'。但是,对于任意复杂的决策机制,您总是可以使用与“DataTrigger”和“Converter”相同的主体方法,或根据视图模型中的ItemsLoaded等不同属性作出决策。 – grek40
感谢链接mm8,文章非常有趣。我从中得到启发,找出解决方案。 –