2010-11-30 3 views
0

J'ai deux éléments: une zone de liste et un message "cette liste est vide". Je voudrais lier leur visibilité à ItemsSource étant vide. Cependant, je ne suis pas sûr de savoir comment faire:Silverlight: Difficulté à se lier à la visibilité

 <TextBlock Text="No favorite searches yet. Add some by searching, then clicking 'Add to Favorites'" 
        Padding="10,0" 
        VerticalAlignment="Center" 
        Visibility="{Binding Path=FavoriteFilters.IsEmpty, Converter={StaticResource visibilityConverter}}" 
        /> 

     <ListBox ItemsSource="FavoriteFilters" 
       x:Name="favoriteFiltersList" 
       Visibility="{Binding Path=FavoriteFilters.IsEmpty, Converter={StaticResource visibilityConverter}}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <my:FavoriteFilterLink /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Ils sont à la fois visibles, bien que le ItemsSource est vide. En outre, je ne suis pas sûr comment inverser la condition pour le ListBox.

Le convertisseur de visibilité:

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(); 
    } 
} 

Répondre

1

Vous pourriez être mieux écrire deux convertisseurs, l'un pour l'autre la zone de liste pour le TextBlock. La logique de chacun serait plus simple et vous n'auriez pas besoin de passer un paramètre pour obtenir le résultat correct.

Bien qu'il ne soit pas aussi élégant qu'une solution de convertisseur unique, il sera beaucoup plus facile à entretenir. Si vous voulez vraiment passer un paramètre, vous devez utiliser le ConverterParameter.

Il y a un exemple here mais je ne suis pas sûr à 100% qu'il répondra à vos besoins. La syntaxe XAML simplifiée est:

<TextBlock Visibility="{Binding FavoriteFilters.IsEmpty, 
    Converter={StaticResource visibilityConverter}, ConverterParameter=false}"/> 

<ListBox Visibility="{Binding FavoriteFilters.IsEmpty, 
    Converter={StaticResource visibilityConverter}, ConverterParameter=true}"/> 

Ensuite, dans votre convertisseur (simplifié):

bool show = (bool)value; 
bool visible = (bool)parameter; 
if (visible) 
{ 
    return show ? Visibility.Visible : Visibility.Collapsed; 
} 
else 
{ 
    return show ? Visibility.Collapsed : Visibility.Visible; 
} 
+0

Comment pourrais-je passer un paramètre à un convertisseur si je voulais? –

+0

@Rosarch - réponse mise à jour. – ChrisF

+0

Merci. Je pense que le lien est cassé cependant. –

Questions connexes