-1
votes

Désactiver les articles WPF Combobox basés sur une autre propriété

Il y a cette liste déroulante dans une application WPF qui est peuplée d'une énumération. Comment désactiverait-il certains de ses articles? La désactivation doit être dynamique, basée sur une autre propriété dans la vue de la vue. xxx pré>

EnummarkupUntension CODE> est défini ainsi: P>

public sealed class EnumMarkupExtension : MarkupExtension
{
    public Type Type { get; set; }
    public EnumMarkupExtension(Type type) => this.Type = type;

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        string[] names = Enum.GetNames(Type);
        string[] values = new string[names.Length];

        for (int i = 0; i < names.Length; i++) 
            values[i] = Resources.ResourceManager.GetString(names[i]);
        return values;
    }
}


6 commentaires

La désactivation d'un article signifierait la liaison de la propriété isenabled d'un individu ComboBoxItem à une propriété d'un élément de modèle d'affichage. Cela serait fait dans un élémentContainestyle. Et il nécessiterait de lier les objets à une collection d'éléments de modèle d'affichage avec une propriété source pour cette liaison.


Je suis d'accord avec @clemens. Si vous partagez, en fonction du type de propriété dans ViewModel U souhaitez désactiver les éléments de Combobox, pourriez-vous suggérer quelque chose.


@Clemens merci, je vais essayer ceci demain. Je suppose que je devrai réécrire la partie qui remplit le combo. La propriété utilisée pour désactiver certains éléments n'est qu'une valeur de bool.


Il devrait s'agir d'une propriété booléenne avec une notification de changement, car elle " doit être dynamique ".


J'avais oublié ça. Vous avez raison, j'utilise Prism, je ferai un setProperty dessus.


@Clemens j'ai eu ce fonctionnement en utilisant votre méthode, merci beaucoup! Pourriez-vous mettre cela dans une réponse afin que je puisse l'accepter?


3 Réponses :


-1
votes

Vous pouvez utiliser un multibindage dans lequel l'une des valeurs est au lieu du ConverterParameter . Voir cette Réponse


1 commentaires

Merci, je pense avoir vu ça, je vais essayer ça aussi.



-2
votes

Modifier l'itemTemplate de ComboBoxItem, dans le modèle d'élément Lié ISEnabled avec la valeur de la vue, la valeur de la vue (il doit s'agir d'un index) et du paraemètre de convertisseur la valeur de l'élément lui-même.


1 commentaires

Merci, je ne suis pas sûr de comprendre, est-ce la même chose que le commentaire sur la question?



0
votes

Je sais que vous avez résolu le problème avec l'aide de @Clemens. Enchantez toujours une réponse aux autres personnes qui pourraient la même question.

supposer que VMDataSource est de la source de données dans la vue de vie et avec chaque élément de VMDataSource contient un drapeau booléen pour indiquer s'il faut activer / désactiver l'élément. Le suivi du code suivant fonctionnerait comme vous avez interrogé dans le poteau. P>

class Disabler : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return !Equals(values[0], values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


2 commentaires

Merci! J'ai fait quelque chose de légèrement différent, en utilisant datriggiggiggentrez , mais cela semble inutile, votre méthode est plus concise. J'ai aussi utilisé inotifypropertychanged pour le type d'élément.


heureux tu l'as trouvé utile.