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

问题描述:

考虑wpf中的TextBlock,它与视图模型中的属性异步绑定,其中get使用耗时的方法。使用xaml代码中的Fallback标记,我可以将TextBlockText标记设置为“正在加载...”。如何在加载时显示“加载”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}}"/> 

请阅读文章以了解更多信息关于做什么和不该做什么。

+1

感谢链接mm8,文章非常有趣。我从中得到启发,找出解决方案。 –

取决于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> 
+0

感谢这个答案grek40。你的意思是'Value =“{x:Null}”'是控制有界属性的“尚未加载”特征的标签吗? –

+0

是的,在这个例子中,我假定'ItemsSource'在加载之前是'null'。但是,对于任意复杂的决策机制,您总是可以使用与“DataTrigger”和“Converter”相同的主体方法,或根据视图模型中的ItemsLoaded等不同属性作出决策。 – grek40