Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre éclairé Avatar de WebPac
    Inscrit en
    mai 2004
    Messages
    932
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 932
    Points : 383
    Points
    383

    Par défaut Comment définir une valeur de visibilité par défaut en mode design ?

    Bonjour, je n'arrive à afficher les composants en mode design lorsque leurs propriétés Visibility sont bindées.

    Voici un exemple de code simpliste pour expliquer mon problème :
    Classe VM qui est le DataContext de la form
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
        public class MiniVM : INotifyPropertyChanged
        {
            public MiniVM()
            {
                _IsVisibleParDefaut = true;
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            protected virtual void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
     
            private bool _IsVisibleParDefaut;
     
            public bool IsVisibleParDefaut
            {
                get { return _IsVisibleParDefaut; }
                set
                {
                    if (value != _IsVisibleParDefaut)
                    {
                        _IsVisibleParDefaut = value;
                        OnPropertyChanged("IsVisibleParDefaut");
                        OnPropertyChanged("IsInvisibleParDefaut");
                    }
                }
            }
     
            public bool IsInvisibleParDefaut
            {
                get { return !_IsVisibleParDefaut; }
            }
        }
    Le XAML de la form :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <Window x:Class="LaboWPF.BacASable"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:laboWpf="clr-namespace:LaboWPF"
            Title="BacASable" Height="300" Width="300"
            mc:Ignorable="d"
            d:DataContext="{d:DesignInstance laboWpf:MiniVM}">
        <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisibility" />
        </Window.Resources>
        <UniformGrid>
            <Label Content="Visible" Visibility="{Binding IsVisibleParDefaut, Converter={StaticResource BoolToVisibility}}"/>
            <Label Content="InVisible" Visibility="{Binding IsInvisibleParDefaut, Converter={StaticResource BoolToVisibility}}" />
            <Button Content="Changer la visibilité" Click="ButtonBase_OnClick"/>
        </UniformGrid>
    </Window>
    Et l'événement du bouton :
    Code :
    1
    2
    3
    4
    5
     
            private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
            {
                (DataContext as MiniVM).IsVisibleParDefaut = !(DataContext as MiniVM).IsVisibleParDefaut;
            }
    En fait, ce problème n'arrive que lorsque je définit quel est le DataContext de la form dans le code xaml :
    Code :
    d:DataContext="{d:DesignInstance laboWpf:MiniVM}"
    Mais je souhaite garder ce code car il est plus facile de s'y retrouver dans les gros codes xaml et aussi pour la complétion de code de resharper.

    J'ai essayé en utilisant d:LayoutOverrides mais ça ne fonctionne pas, ainsi qu'en essayant d'utiliser d: DesignData.

    Merci par avance pour votre aide.

  2. #2
    Membre éclairé Avatar de WebPac
    Inscrit en
    mai 2004
    Messages
    932
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 932
    Points : 383
    Points
    383

    Par défaut

    J'ai trouvé une solution en utilisant un converter personnalisé.
    Voici le code du converter :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
        [ValueConversion(typeof(bool), typeof(Visibility))]
        public class ConverterBoolToVisibility : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
                    return Visibility.Visible;
                else
                    return (bool)value ? Visibility.Visible : Visibility.Collapsed;
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return (Visibility)value == Visibility.Visible;
            }
        }
    En fait, il renvoie toujours Visible quand on est en mode designer et non en exécution. Si toutefois vous avez des solutions plus élégantes que de devoir modifier le code behind et utiliser un converter autre que celui par défaut, je suis toujours preneur.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •