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

Windows Presentation Foundation Discussion :

Communication entre User Control


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut Communication entre User Control
    Bonjour à tous

    J'aimerais pouvoir faire communiquer des Usercontrol entre eux sans que la page WPF n'interviennent trop directement.

    Je m'explique. J'ai conçu deux UserControl. Ensemble j'aimerais qu'il forme un filtre pour mes données.
    Ainsi le UserControl F_filtre est utilisé pour filtrer sur un champ de mon choix. Il peut être utilisé autant de fois que nécessaire. Par exemple sur le screen qui suit il est représenté par UserControl 1 et 2.

    Le deuxième UserControl est le F_Appliquer_Filtre qui représente deux boutons (pour appliquer et supprimer un filtre). Représenté par le UserControl 3.



    Mon but (utopique ?) est de pouvoir récupérer sur le CLICK du bouton du UserControl 3, les données des UserControl 1 et 2 (ou plus !).

    Donc au final j'aimerais faire sur mon UserControl 3 un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Foreach( F_Filtre F in MaPageWPF) ...
    Je vous remercie de votre aide

    Bonne journée

  2. #2
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Bonjour,

    Si ta vue entière est bindée sur un ViewModel, chacun des filtres peut être lui-mêmes bindés sur un viewModel contenu dans une collection du ViewModel parent.

    Ton UserControl est alors le DataTemplate affichant un ViewModel correspondant à un filtre.

    Alors dans le ViewModel parent tu as accès à chacun des filtres via leurs viewModel. Si tu place une commande sur les boutons d'UC3 alors tu y a accès aussi

    Bonne chance,

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut
    Bonsoir,

    Tout d'abord merci de ta réponse

    Alors, malheureusement, rien n'est bindés pour le moment.
    Donc en fait, dans ce cas, j'ai juste besoin des valeurs des filtres (85470 et 12) pour relancer une requête SQL sur le Click de UC3.

  4. #4
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut [MVVM light] Communication entre UserControl : MAJ Vue maitre/detail
    Bonsoir,
    Je me permets de rebondir sur le sujet parce que je rencontre aussi ce souci :

    Pour ma part, j'ai 2 UserControls (un pour la vue maître de mon appli et l'autre pour la vue détail) :

    Code xaml : 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
     
    <r:RibbonWindow 
            x:Class="TrackTime.Views.Ribbon"
            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:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" xmlns:View="clr-namespace:TrackTime.Views" mc:Ignorable="d"
            Height="800"
            Width="1200"
            Title="Nature &amp; Construction - TrackTime"
            DataContext="{Binding Main, Source={StaticResource Locator}}" WindowState="Normal">
     
    ...
    <Grid>
    <View:MasterViewUserControl x:Name="MasterViewUserControl" 
                             Grid.Column="0" Grid.Row="0"/>
                <View:DetailedViewUserControl x:Name="DetailedViewUserControl" 
                             Grid.Column="1" Grid.Row="0"/>
                <StatusBar Height="23" HorizontalAlignment="Left" Margin="0,605,0,0" Name="statusBar1" VerticalAlignment="Top" Width="1178" Grid.ColumnSpan="2" Grid.Row="1"/>
            </Grid>
    </r:RibbonWindow>

    Le ViewModel de la fenêtre principale ne sert à rien : chacun de mes UserControl sont bindés sur leur propre ViewModel.

    Quelles sont les bonnes pratiques pour faire communiquer mes 2 UsersControl (lorsqu'un élément de la listBox du UserControl maitre est sélectionné, peuplement des champs du UserControl détail)? J'utilise le framework MVVM light de Laurent Bugnion, et une des pistes est le Messenger inclus, mais je ne vois pas comment l'utiliser.

    Merci pour votre aide !

    Cordialement

    Nixar

  5. #5
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut
    Pour ceux qui cherchent encore et qui ont le même souci que moi voici la réponse :

    Partant du principe que vous avez 2 UserControls (ou 2 pages) Maitre/Detail, et que vous utilisez le MVVM light :

    Code à ajouter dans votre liste d'item (ici, une listBox) pour binder l'item en cours sur la propriété qui va bien dans la ViewModel_Master_View :

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <ListBox Name="listBoxProjects" Margin="10"
                         ...
                         SelectedItem ="{Binding SelectedProject}"
                         >...</ListBox>

    Code de la propriété dans la ViewModel_Master_View :

    Code c# : 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
    /// <summary>
            /// The <see cref="SelectedProject" /> property's name.
            /// </summary>
            public const string SelectedProjectPropertyName = "SelectedProject";
     
            private Project _projectSelected;
     
            /// <summary>
            /// Sets and gets the SelectedProject property.
            /// Changes to that property's value raise the PropertyChanged event. 
            /// </summary>
            public Project SelectedProject
            {
                get
                {
                    return _projectSelected;
                }
     
                set
                {
                    if (_projectSelected == value)
                    {
                        return;
                    }
                    // On garde l'ancienne valeur
                    var oldValue = _projectSelected;
                    // On met à jour la variable privée de la classe avec la nouvelle velur
                    _projectSelected = value;
                    // On broadcaste un message pour propager le changement
                    RaisePropertyChanged(SelectedProjectPropertyName, oldValue, value, true);
                }
            }

    Maintenant, il faut abonner à ce message le ViewModel_Detail :

    Code c# : 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
    38
    39
    40
     
        public DetailedProjectViewModel()
            {
                ResetDb = new RelayCommand(resetDb);
                // C'est l'abonnement au message émis avant
                Messenger.Default.Register<PropertyChangedMessage<Project>>(
                                            this,
                                            (action) => DispatcherHelper.CheckBeginInvokeOnUI(() => SelectedProject = action.NewValue)
                                            );
            }
     
    /// <summary>
            /// The <see cref="SelectedProject" /> property's name.
            /// </summary>
            public const string SelectedProjectPropertyName = "SelectedProject";
     
            private Project _selectedProject;
     
            /// <summary>
            /// Sets and gets the SelectedProject property.
            /// Changes to that property's value raise the PropertyChanged event. 
            /// </summary>
            public Project SelectedProject
            {
                get
                {
                    return _selectedProject;
                }
     
                set
                {
                    if (_selectedProject == value)
                    {
                        return;
                    }
     
                    _selectedProject = value;
                    RaisePropertyChanged(SelectedProjectPropertyName);
                }
            }

    Et voilà, vous avez passé un message entre 2 ViewModel, avec comme contenu la référence à l'item qui vient d'être sélectionné

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 23
    Par défaut
    Merci à vous deux, cela devrait faire mon bonheur !

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

Discussions similaires

  1. communication entre 2 web controls
    Par topolino dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/10/2008, 11h16
  2. Object entre user control
    Par topolino dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/10/2008, 13h52
  3. passage de paramètres entre web user control
    Par mi1StagiR dans le forum ASP.NET
    Réponses: 5
    Dernier message: 20/05/2008, 12h17
  4. Communication entre deux controllers
    Par Feustine dans le forum Ruby on Rails
    Réponses: 10
    Dernier message: 17/12/2007, 09h58
  5. [C#][ASP 2.0] Interactions entre User Controls
    Par thallak dans le forum ASP.NET
    Réponses: 8
    Dernier message: 02/08/2007, 14h42

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