IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

INotifyPropertyChanged entre une page et un user control


Sujet :

Silverlight

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 17
    Points
    17
    Par défaut INotifyPropertyChanged entre une page et un user control
    Bonjour,

    Quasiment tout est dans le titre. J'ai un user control qui contient et affiche différentes Pages via un navigation:Frame. Dans ma page je récupère un event en cas d'erreur que je souhaite remonter jusqu'au user control. Pour ça j'ai mis en place une class INotifyPropertyChanged qui dans un 1er temps ne fait qu'afficher / masquer un TextBlock à l'aide de Visibility.Collapsed.

    J'utilise depuis le userControl le INotifyPropertyChanged pour l'initialisation en mode Collapsed et là ça passe. Mais d'une fois que je suis sur la Page, la notification n'est pas transmise au userControl.

    ici mon système de notifications
    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
    public class Property : INotifyPropertyChanged
        {
            private Visibility _actionVisible;
     
            public Visibility ActionsVisible
            {
                get { return _actionVisible; }
                set
                {
                    _actionVisible = value;
                    Notification("ActionsVisible");
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void Notification(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    il est appelé comme ceci sur mon userControl :
    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
     
    Property notif = new Property();
     
    public Automation()
            {
                InitializeComponent();
     
                this.DataContext = notif;
     
                notif.PropertyChanged += new PropertyChangedEventHandler(notif_PropertyChanged);
                notif.ActionsVisible = Visibility.Collapsed;
            }
     
     void notif_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                error.Text("Handled");
                error.Show();
            }
    j'ai également tenté de le binder depuis le xaml comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock FontSize="18" Visibility="{Binding Path=ActionsVisible, UpdateSourceTrigger=PropertyChanged}" Foreground="#FFB70505" Height="34.286" Margin="244,544,0,0" Name="txtConnection" Text="Problèmes de connexion, veuillez patienter." VerticalAlignment="Top" HorizontalAlignment="Left" Width="393.715" />
    Sur ma Page qui doit me faire remonter l’événement j'ai ça :
    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
     
    Property property = new Property();
     
    private void perteConnexion(string err)
            {
                if (err.Contains("NotFound"))
                {
                    //debug
                    error.Text(Resource.ErrorConnection + err);
                    error.Show();
     
                    //modifie la propriété pour notifier le conteneur du changement d'état
                    property.ActionsVisible = Visibility.Visible;
                }
            }
    En l'état, je passe bien dans perteConnexion(), j'arrive bien dans le setter ActionsVisible mais aucun événement ne se déclenche dans le userControl pour modifier l'état du TextBlock!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    j'ai quelque peut remanié ma façon de faire pour éviter le INotifyPropertyChanged et j'ai pu avancer un bout mais pas résoudre mon problème. Mon architecture actuelle est la suivante : j'ai une page qui contient d'autres pages qui s'affichent dans une frame. Depuis mes pages enfants je souhaite toujours remonter des infos à ma page parent. Sur ma page parent j'ai une méthode public qui gère l'état du TextBlock

    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
    public void InfoIsVisible(bool visibility)
            {
                if (visibility == true)
                {
                    proxy.Abort();
                    loadInfos();
     
                    txtConnection.Visibility = Visibility.Visible;
     
                    error.Text("état du msg : " + txtConnection.Visibility.ToString());
                    error.Show();
                }
                else
                {
                    txtConnection.Visibility = Visibility.Collapsed;
                }
            }
    Les enfants appellent simplement cette méthode avec true/false en option. La ligne error.Text("état du msg : " + txtConnection.Visibility.ToString()); m'affiche un messageBox qui confirme que l'état de txtConnection a bien été modifié à Visible en cas d'erreur. le hic c'est que visuellement rien ne se passe...

    Pour plus d'infos cette erreur est généré lorsque ma connexion à un service wcf se met en faulted. Le service est un service polling duplex et le but de l'opération est d'avertir l'utilisateur qu'il y a un soucis et tenter une reconnection par la même occasion, d'où le proxy.Abort(). loadInfos() étant l'initialisation des connections.

    En espérant que cette nouvelle version inspirera quelqu'un.

    PS : je suis sur silverlight 5 au fait.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    pour ceux que ça intéresse, voici la solution

    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
    public void InfoIsVisible(bool visibility)
            {
                MainPage m = (MainPage)Application.Current.RootVisual;
     
                if (visibility == true)
                {
                    proxy.Abort();
                    loadInfos();
     
                    m.txtConnection.Visibility = Visibility.Visible;
     
                    //error.Text("état du msg : " + txtConnection.Visibility.ToString());
                    //error.Show();
                }
                else
                {
                    m.txtConnection.Visibility = Visibility.Collapsed;
                }
            }

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    J'ai pas tout saisi au problème, mais l'utilisation de message ne serait-il pas plus aproprié?
    Enfin ce qui me gène dans ta solution c'est le fait de récupérer l'instance de ta MainPage en passant par :
    Application.Current.RootVisual .
    Et si dans 1 an tu veux changer la page d'accueuil?
    Sans même passer par une messagerie, tu peux toujours utiliser un systeme de "parent", (voir même rajouter un "root"). Je pense qu'en terme de maintenance ca sera un peu mieux.
    Les puristes te diront même que ce n'est jamais suffisant, qu'il faut absolument que tout soit découpé et aucune réfference direct. Ca peut être vrai, mais ca peut aussi vite devenir une usine à gaz pour pas grand chose!

    Bref ca dépend un peu du temps que tu disposes, mais souvent le temps que l'on gagne à un instant t, il est perdu à t+3, à t+5 à t+6....

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/12/2007, 10h30
  2. dialogue entre une page web et un code C++builder
    Par tenebres dans le forum C++
    Réponses: 0
    Dernier message: 19/10/2007, 20h15
  3. Dialogue entre une page et sa popup
    Par chti_vince dans le forum ASP.NET
    Réponses: 3
    Dernier message: 28/06/2007, 09h25
  4. Affichage d'une image dans un user control
    Par fabfor dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/04/2007, 17h13
  5. [C#]liste de choix dans une propriété d'un user control
    Par LeDeveloppeurDotNet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/10/2005, 12h41

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