405 votes

Comment lier les propriétés booléennes inverses dans WPF?

Je suis ouvert aux suggestions avec le titre. Il est vraiment assez mauvais.

Ce que j'ai est un objet qui a un IsReadOnly de la propriété. Si cette propriété est vraie, je voudrais mettre l' IsEnabled de la propriété sur un Bouton ( par exemple ), false.

Je voudrais croire que je peux le faire aussi facilement qu' IsEnabled="{Binding Path=!IsReadOnly}" mais cela ne veut pas voler avec WPF.

Je suis relégué à avoir à passer par tous les paramètres de style? Semble tout simplement trop verbeux pour quelque chose d'aussi simple que de créer un booléen à l'inverse de l'autre bool.

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

521voto

Chris Nicol Points 4240

Vous pouvez utiliser un ValueConverter qui inverse une propriété booléenne pour vous.

XAML:

 IsEnabled="{Binding Path=IsReadOnly, Converter={StaticResource InverseBooleanConverter}}"
 

Convertisseur:

 [ValueConversion(typeof(bool), typeof(bool))]
    public class InverseBooleanConverter: IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(bool))
                throw new InvalidOperationException("The target must be a boolean");

            return !(bool)value;
        }

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

        #endregion
    }
 

103voto

Paul Alexander Points 17611

Avez-vous considéré une propriété IsNotReadOnly? Si l'objet lié est un ViewModel dans un domaine MVVM, la propriété supplémentaire est parfaitement logique. S'il s'agit d'un modèle Entity direct, vous pouvez considérer la composition et présenter un modèle de vue spécialisé de votre entité au formulaire.

22voto

Noxxys Points 44

Je recommanderais d'utiliser https://quickconverter.codeplex.com/

Inverser un booléen est alors aussi simple que: <Button IsEnabled="{qc:Binding '!$P', P={Binding IsReadOnly)}" />

Cela accélère le temps normalement nécessaire pour écrire des convertisseurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X