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 :

Communication entre usercontrol et page


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut Communication entre usercontrol et page
    Bonjour à tous,

    Deuxième question en une journée, je me sens pas très productif aujourd'hui...

    Voilà dans mon projet, j'ai une page principal (MainPage : usercontrol) où se trouve un boolean et je souhaite modifier cette valeur dans une autre page (Home : Page).

    Je pense qu'il faut que je récupère l'instance du MainPage mais je ne sais pas comment faire!!

    Merci

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Il vaudrait mieux que tu mettes en places un object contenant ta propriété boolean et qu'il soit commun à tes deux pages.

    Si en plus cet objet utilise la pattern MVVM, alors là c'est top.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    J'ai regardé la MVVM et sa à pas l'air si simple!! Et je ne peux pas déporter mon boolean puisque c'est un DependencyProperty. Celui ci me sert à rendre enabled ou non des onglets selon la personne connecté.

    il n'y aurait pas un autre moyen?

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Je n'ai pas été assez clair je pense et sans doute pas assez précis.

    tu ne dois pas bouger ta DependencyProperty mais faire un binding sur la propriété de l'objet dont je te parlais. Normalement elle devrait hériter de INotifyPropertyChanged (renseigne toi la dessus, c'est une notion importante) mais comme c'est pour un changement de page ce n'est pas la peine (et cela va simplifier un peu les choses)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Toto
    {
        public bool Mapropriete
        {
             get;
             set;
        }
    }
    coté XAML sur MainPage.xaml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         <my:MonUserControl MonBoolean={Binding Path=MaPropriete, Mode=TwoWay}"/>
    coté XAML sur HomePage.xaml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         <my:MonAutreUserControl MonAutreBoolean={Binding Path=MaPropriete, Mode=TwoWay}"/>
    En oubliant pas de rerouter le DataContext du UserControl dans son constructeur sur lui même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.LayoutRoot.DataContext = this;

  5. #5
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    Ok merci beaucoup (encore) je vais regarder pour les notions importantes. J'ai compris ce que tu m'a dis sauf le

    <my:MonUserControl MonBoolean={Binding Path=MaPropriete, Mode=TwoWay}"/>
    Je comprends pas ce que je dois mettre à la place.

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    C'est un userControl mais cela peut être ta page ou un control, comme tu veux.

  7. #7
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    J'ai fait sa pour que sa soit clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    xmlns:my="clr-namespace:MonProjet"
    mc:Ignorable="d" d: DesignWidth="640" d: DesignHeight="480">
     
    <my:MainPage IsConnected="{Binding Path=CIsConnected, Mode=TwoWay}"/>
    Mais lorsque j'exécute j'ai cette erreur :

    Une exception non gérée du type 'System.StackOverflowException' s'est produite dans System.Windows.dll

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    tu peux nous montrer ta définition de CIsConnected ?

  9. #9
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    J'ai juste copié coller ce que tu m'a dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    public class Communication
        {
            public bool CIsConnected
            {
                get;
                set;
            }
        }

  10. #10
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    J'ai l'impression que tu boucles ta MainPage sur ta MainPage non ?

  11. #11
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    Oui je pense aussi, sa explique le overflow mais je ne sais pas où. Pourtant j'ai suivie ce que tu m'a dit!!

    Pourrais je encore profiter de ton expérience??

  12. #12
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Je vais reprendre ton exemple pour que ce soit plus clair

    Celui ci me sert à rendre enabled ou non des onglets selon la personne connecté.
    Pour l'exemple un bouton est associé à un onglet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button IsEnabled="{Binding Path=CIsConnected}"/" Content="Onglet 1"/>
    J'ai auss viré le Mode TwoWay car sur un bouton il est forcément OneWay (valeur par défaut du binding d'un bouton)

  13. #13
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    Je vais expliquer le tout pour que sa soit plus simple et tu comprenne ce que je veux faire.

    Je suis partie du projet de base de silverlight composé d'un Usercontrol (MainPage) et de Navigationage (Home, About, etc.)

    Après quelques modifications, seul la page home est visible dès le départ grâce au DependencyProperty. Cette page permet de se connecter sur le site avec identifiant et mot de passe.

    Si les infos sont dans la base de donnée alors les autres page peuvent apparaitre mais (et voilà le soucis) je dois dire au UserControl MainPage que c'est ok et qu'il doit mettre le boolean IsConnected = true.

    Voilà j'espère que j'ai été clair dans l'explication.

    Maintenant coté code j'ai sa :

    MainPage.xaml.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static readonly DependencyProperty IsConnectedProperty = DependencyProperty.Register("IsConnected", typeof(Visibility), typeof(MainPage), new PropertyMetadata(null));
     
    public bool IsConnected
    {
                get { return ((Visibility)this.GetValue(IsConnectedProperty) == Visibility.Visible) ? true : false; }
                set { this.SetValue(IsConnectedProperty, (value) ? Visibility.Visible : Visibility.Collapsed); }
    }
    MainPage.xaml

    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
    xmlns:my="clr-namespace:Projet"
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
        
        <Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}">
            <my:MainPage IsConnected="{Binding Path=CIsConnected, Mode=TwoWay}"/>
    
            <Grid x:Name="NavigationGrid" Style="{StaticResource NavigationGridStyle}">
                <Border x:Name="BrandingBorder" Style="{StaticResource BrandingBorderStyle}">
                    <StackPanel x:Name="BrandingStackPanel" Style="{StaticResource BrandingStackPanelStyle}">
                        <TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}" 
                                   Text="Nom du projet"/>
                        <TextBlock x:Name="DescriptionTextBlock" Style="{StaticResource DescriptionStyle}"
                                   Text="Description"/>
                    </StackPanel>
                </Border>
    
                <Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}">
                    <StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}">
                        <HyperlinkButton x:Name="DayView" Style="{StaticResource LinkStyle}"
                                         NavigateUri="/Home" TargetName="ContentFrame" Content="accueil"/>
    
                        <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>
    
                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}" Visibility="{Binding IsConnected}"
                                         NavigateUri="/DayView" TargetName="ContentFrame" Content="Affichage journalier"/>
    
                    </StackPanel>
                </Border>
            </Grid>
    Home.xaml.cs

    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
     
    private Users ActualUser;
    public static readonly DependencyProperty IsConnectedProperty = DependencyProperty.Register("IsConnected", typeof(Boolean), typeof(Home), new PropertyMetadata(null));
     
    public bool IsConnected
    {
                get { return (bool)this.GetValue(IsConnectedProperty); }
                set { this.SetValue(IsConnectedProperty, value); }
    }
     
    public Home()
    {
                InitializeComponent();
                this.LayoutRoot.DataContext = this;
                IsConnected = false;
    }
    Home.xaml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    xmlns:my="clr-namespace:Projet"
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"
        Title="Accueil" Style="{StaticResource PageStyle}">
    
        <Grid x:Name="LayoutRoot">
            <my:Home IsConnected="{Binding Path=CIsConnected, Mode=TwoWay}"/>
            <ScrollViewer x:Name="PageScrollViewer" Style="{StaticResource PageScrollViewerStyle}" >
                             .
                             .
                             .
                             .
             </ScrollViewer>
        </Grid>
    Communication.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    namespace Projet.Classe
    {
        public class Communication
        {
            public bool CIsConnected
            {
                get;
                set;
            }
        }
    }
    Arborescence :

    Dossier classe
    Communication.cs

    Dossier Views
    Home.xaml
    Home.xaml.cs
    DayView.xaml
    DayView.xaml.cs

    MainPage.xaml
    MainPage.xaml.cs


    Voilà, j'espère que ça éclaircie un peu la situation.

  14. #14
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    Pas d'idée pour ce problème, je suis sur qu'il manque pas grand chose...

  15. #15
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 101
    Par défaut
    Bon j'ai trouvé une solution, si sa peut aider quelqu'un.

    Je n'ai plus qu'une DependencyProperty dans ma page principal et je modifie directement cette DependencyProperty dans la page Home avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Application.Current.RootVisual as MainPage).IsConnected = true;
    Voilà, merci de m'avoir répondu et d'avoir participé à mes recherches

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

Discussions similaires

  1. Communication entre UserControl et winform
    Par topolino dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/06/2009, 16h03
  2. Communication entre UserControl et MasterPage
    Par titan_33 dans le forum ASP.NET
    Réponses: 12
    Dernier message: 30/07/2008, 13h56
  3. Communication entre popup et page mere
    Par fepagaf dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 14/09/2007, 10h40
  4. [WebForms]Communication entre popup et page principale
    Par ben_popcorn dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 05/12/2006, 10h33
  5. Communication entre iframe et page
    Par goldorax113 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/05/2006, 17h07

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