6
votes

EmptylistTovisibilitéconverter

J'essaie de faire une "liste vide au convertisseur de visibilité" pour WPF. Il s'agit d'un inventant qui prend un objet (qui devrait être une liste) et si la liste est vide (ou si l'objet transumé est null), il devrait renvoyer une visibilité. Collabossed; Si la liste n'est pas vide, il doit renvoyer une visibilité.Vistibile;

Je prévois d'utiliser ceci pour un datagramrid. Le plan consiste à rendre la DataGrid invisible (effondré) chaque fois que la liste donnée à l'itemSource est une liste vide ou une null. p> xxx pré>

J'ai écrit le convertisseur de videylisttovisibilité comme suit: p> xxx pré>

Ceci fonctionne bien lorsque des articles sont donnés en tant que null mais quand les articles sont Donné comme une liste, cela ne fonctionne pas ... Je pense que le code ci-dessous n'est pas correct et ne peut pas détecter si "valeur" est une liste ou non ... Toute astuce? p>

if (value is IList<Object>)
            {
                if ((value as IList<Object>).Count == 0)
                {
                    return Visibility.Collapsed;
                }
                else
                {
                    return Visibility.Visible;
                }


1 commentaires

Salut madfeb. S'il vous plaît arrêtez de signer vos messages. Cordialement, et avec de meilleures salutations pour vous et vos enfants,


6 Réponses :


2
votes

Je suppose que c'est que c'est à cause du fait que vous utilisez iList dans le convertisseur mais votre collection réelle est un ilist . Voir, ilist n'est pas covariant, vous ne pouvez donc pas convertir tout IList vers un iList . Ma suggestion sera d'essayer d'utiliser iEnumerable dans le convertisseur et utilisez la méthode de l'extension de compte () pour déterminer le nombre d'éléments de la collection.


1 commentaires

J'ai utilisé "n'importe quel" plutôt que Count ()> 0> ((iEnumerable ) valeur). VISIBILITÉ.Visible: visibilité.Collaptée;



5
votes

Je suppose que le problème est que l'objet de collecte reste le même, lorsque vous ajoutez ou supprimez des éléments de celui-ci. Donc, la liaison ne met pas à jour la valeur et le convertisseur n'est pas appelé.


0 commentaires

11
votes

Vous ne pouvez pas lancer votre liste sur iList , mais vous pouvez la jeter en iCollection, puis utiliser icollection.count: voir http://deevw.wordpress.com/2011/07/18/empty-list-visbility-converter/

public class EmptyListVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Visibility.Collapsed;
        else
        {
            ICollection list = value as ICollection;
            if (list != null)
            {
                if (list.Count == 0)
                    return Visibility.Collapsed;
                else
                    return Visibility.Visible;
            }
            else
                return Visibility.Visible;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    {
        throw new NotImplementedException();
    }
}
<ListBox x:Name=”NameChoiceListBox”
         ItemsSource=”{Binding NamesList}”
         SelectedItem=”{Binding SelectedName, Mode=TwoWay}”
         ItemTemplate=”{StaticResource DataTemplateNameChoice}”
         Visibility=”{Binding NamesList, Converter={StaticResource EmptyListVisibilityConverter}}”>


0 commentaires

4
votes

Je pense que c'est tout à fait simple, vous allez ici: xxx

espérant wil aide, merci! - Shams


0 commentaires

2
votes

C # La version 7 prend en charge la correspondance des motifs. Maintenant, vous pouvez écrire:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    switch (value)
    {
        case null:
            return Visibility.Collapsed;
        case ICollection list:
            return list.Count == 0 ? Visibility.Collapsed : Visibility.Visible;
    }

    return Visibility.Visible;
}


0 commentaires

0
votes

Une meilleure alternative consiste à utiliser Observablecollection, puis à se lier à sa propriété de compte: convertisseurs WPF et observablections


0 commentaires