2010-11-04 5 views
2

Je construis une application wp7 dans Silverlight. J'ai du contenu qui est chargé de manière asynchrone et des messages qui indiquent que le chargement n'est pas encore terminé. J'aimerais que les messages de chargement disparaissent dès que la zone de liste du contenu n'est pas vide. Est-il possible de le faire juste en XAML? Quelque chose comme lier la propriété Visibility à StoryListBox.ItemsSource.IsEmpty?Silverlight: Supprimer le chargement du message sur le chargement du contenu sans code derrière?

StoryListBox est rempli lorsque son ItemsSource est défini sur une collection observable après que les données sont disponibles.

<TextBox x:Name="LoadingMessage" Text="Loading..." Grid.Row="0" /> 
    <ProgressBar x:Name="LoadingProgress" IsIndeterminate="True" Style="{StaticResource PerformanceProgressBar}" /> 

    <ListBox x:Name="StoryListBox" Grid.Row="0" /> 

Mise à jour: J'ai essayé ce qui suit, mais il ne fonctionne pas:

<StackPanel x:Name="Loading" Grid.Row="0" Visibility="{Binding StoryListBox.ItemsSource.IsEmpty, Converter={StaticResource visibilityConverter}}"> 
      <TextBox Text="Loading..." /> 
      <ProgressBar IsIndeterminate="True" Style="{StaticResource PerformanceProgressBar}" /> 
     </StackPanel> 

     <ListBox x:Name="StoryListBox" Grid.Row="1" /> 

Le panneau de pile Loading affaisse jamais.

+0

Je voudrais vous aider si vous avez fourni plus de détails sur la façon dont ContentListBox est lié? Est-ce que sa propriété 'ItemsSource' est assignée une fois que le contenu est disponible ou est-il juste lié à un' ObservableCollection' ou 'ICollectionView' qui obtient des éléments ajoutés? ContentListBox est-il le "StoryListBox" dans votre xaml, pouvez-vous ranger cette incohérence ?? – AnthonyWJones

Répondre

0

Vous semblez avoir répondu à votre propre question. Oui, vous pouvez simplement lier la visibilité (ou Busy/IsBusy sur un contrôle BusyIndicator à un attribut d'un autre contrôle).

Si la propriété spécifique à lier n'est pas une propriété pouvant être liée, il suffit de lier l'autre contrôle et de personnaliser le convertisseur pour obtenir la propriété de membre souhaitée. Si vous avez des exemples de code spécifiques, il suffit de les poster et je peux poster une solution plus spécifique.

Le problème habituel est que les types (pour la visibilité) sont incompatibles avec les valeurs booléennes, vous devez donc spécifier un convertisseur dans la liaison. Google pour Silverlight VisibilityConvertor (ils sont une dizaine de centimes). Voici le mien:

namespace Common.ValueConverters 
{ 
    using System; 
    using System.Windows; 
    using System.Windows.Data; 

    public class VisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value is bool?) 
      { 
       if (string.IsNullOrEmpty((string)parameter)) 
       { 
        return (value as bool?).Value ? Visibility.Visible : Visibility.Collapsed; 
       } 
       else 
       { 
        return (value as bool?).Value ? Visibility.Collapsed : Visibility.Visible; 
       } 
      } 
      throw new ArgumentException(); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

Une utilisation du convertisseur ressemblerait à ceci:

<Grid Visibility="{Binding ShowDualView, Converter={StaticResource VisibilityConverter}}"> 

Mais très franchement, vous êtes mieux avec un contrôle BusyIndicator lié à une propriété IsBusy:

<Controls:BusyIndicator IsBusy="{Binding IsBusy}"> 

Il suffit de le mettre autour des contrôles que vous voulez avoir caché par l'affichage occupé.

+0

Merci. Je ne sais pas exactement à quoi ressemblerait le XAML. –

+0

@Rosarch: J'ai ajouté quelques exemples Xaml (pour l'utilisation du convertisseur et d'un BusyIndicator). À votre santé –

Questions connexes