p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre éprouvé Avatar de WebPac
    Inscrit en
    mai 2004
    Messages
    942
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 942
    Points : 435
    Points
    435

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éprouvé Avatar de WebPac
    Inscrit en
    mai 2004
    Messages
    942
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 942
    Points : 435
    Points
    435

    Par défaut

    J'ai trouvé une solution en utilisant un converter personnalisé.
    Voici le code du converter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Définir une page comme page par défaut
    Par philiastorge dans le forum JavaScript
    Réponses: 3
    Dernier message: 25/10/2013, 10h12
  2. Définir une page d'accueil par défaut
    Par ryodo dans le forum JavaScript
    Réponses: 8
    Dernier message: 25/08/2010, 15h55
  3. Réponses: 2
    Dernier message: 06/06/2009, 18h25
  4. Réponses: 7
    Dernier message: 29/06/2007, 15h39
  5. [Requete] Comment donner une valeur par défaut à un paramètre
    Par soforever dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 14/05/2007, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo