Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Windows Presentation Foundation
Windows Presentation Foundation Forum d'entraide sur le développement d'applications Windows avec Windows Presentation Foundation
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 14h08   #1
WebPac
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 930
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 930
Points : 417
Points : 417
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.
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 10h42   #2
WebPac
Membre éprouvé
 
Avatar de WebPac
 
Inscription : mai 2004
Messages : 930
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 930
Points : 417
Points : 417
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.

++
WebPac est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h27.


 
 
 
 
Partenaires

Hébergement Web