2017-06-21 40 views
0

考慮wpf中的TextBlock,它與視圖模型中的屬性異步綁定,其中get使用耗時的方法。使用xaml代碼中的Fallback標記,我可以將TextBlockText標記設置爲「正在加載...」。如何在加載時顯示「加載」gif而不是wpf控制器?

但我實際上有一個ListBox綁定到一個IEnumerable<MyType>其中列表框項目顯示不同的字段MyType。如何在加載有界的IEnumerable<MyType>時顯示laoding gif(或任何類型的不同wpf元素)?

我想我可以將Loading元素的Visibility綁定到某種描述異步屬性狀態的bool,但我在xaml中找不到這樣的bool。如果它在xaml中不存在,我可以計算加載方法的狀態並在視圖模型中創建此bool。這是實現它的最好方法嗎?

回答

1

你應該閱讀@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,文章非常有趣。我從中得到啓發,找出解決方案。 –

1

取決於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

相關問題