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 :

MVVM Master et Detail View


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut MVVM Master et Detail View
    Bonjour à tous !

    Je patauge encore en essayant de mettre en place des applications mettant en place le pattern MVVM.

    J'essaye de faire une Master View contenant une listbox populé de personne, et une detail View affichant les détail de du currentItem de ma listbox.
    Jusqu'ici, tout va bien, quand je change de sélection sur ma master view mes élément s'affiche bien dans ma detail View. Le problème est que quand je viens a modifier une personne grâce a ma detail View, les modifications (visuelles) ne se répercute pas dans ma lisbox.

    Alors pour détailler un peu plus, j'ai ma MasterView.xaml qui resssemble à ç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
    16
    17
    18
    19
    20
    21
    22
    23
    DataContext="{Binding Master_VM, Source={StaticResource ServiceLocator}}">
     
        <Grid x:Name="LayoutRoot" Background="White">
            <ListBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding View,Mode=TwoWay}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid Height="30">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="35"></ColumnDefinition>
                                <ColumnDefinition MinWidth="100"></ColumnDefinition>
                                <ColumnDefinition MinWidth="100"></ColumnDefinition>
                                <ColumnDefinition></ColumnDefinition>
                            </Grid.ColumnDefinitions>
     
                            <Image Grid.Column="0" Source="{Binding ImageSource,Mode=TwoWay}" HorizontalAlignment="Left" Height="30" Width="30"></Image>
                            <TextBlock Grid.Column="1" Text="{Binding Name,Mode=TwoWay}"></TextBlock>
                            <TextBlock Grid.Column="2" Text="{Binding SurName,Mode=TwoWay}"></TextBlock>
                            <TextBlock Grid.Column="3" Text="{Binding Path=BirthDate,Mode=TwoWay}"></TextBlock>
     
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    le datacontext de cette dernière est lié a mon masterViewModel grâce à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext="{Binding Master_VM, Source={StaticResource ServiceLocator}}"
    car j'essaye de respecter le pattern d'inversion de contrôle.

    Mon MasterViewModel ressemble à ç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
    16
    17
    18
    19
    20
    21
     public class Master_ViewModel : ViewModel
        {
            public CollectionViewSource source { get; set; }
     
            public ICollectionView View
            {
                get
                {
                    return source.View;
                }
            }
     
            public Master_ViewModel()
            {
                //Pour remplir la liste de personne
                Data.Populate();
     
                this.source = new CollectionViewSource();
                source.Source = Data.ListPersonne;
            }
        }
    Ma DetailView.xaml (je laisse que l'utile) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Grid x:Name="LayoutRoot" Background="White">
            <TextBox Text="{Binding Path=View.CurrentItem.Name,Mode=TwoWay}" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Stretch" Name="Tb_Name" Margin="0,0,10,0"></TextBox>
            <TextBox Text="{Binding Mode=TwoWay, Path=View.CurrentItem.SurName}" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Name="Tb_SurName" Margin="0,0,10,0"></TextBox>
            <sdk:DatePicker  SelectedDate="{Binding Path=View.CurrentItem.BirthDate, Mode=TwoWay}" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Name="Dp_BirthDate" Margin="0,0,10,0"></sdk:DatePicker>
            <Image Grid.Column="1" Grid.Row="3" Source="{Binding Path=View.CurrentItem.ImageSource,Mode=TwoWay}" Height="75" Width="75"></Image>
     
        </Grid>
    Du coup je savais pas trop comment récuperer le CurrentItem de mon MasterViewModel, alors j'ai binder le datacontext de ma detailView sur le MasterViewModel comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext="{Binding Source={StaticResource ServiceLocator}, Path=Master_VM}"
    Mais c'est pas logique que je Bind mon MasterViewModel sur la vue detail

    Je m'emmêle un peu les pinceau là. Si je fait comme je viens de faire il m'est impossible de déclencher le OnPropertyChanged pour que les changement detail se répercute sur la listbox du master. La logique voudrait que je bind le datacontext de ma Vue detail avec mn DetailViewModel, mais alors comment récupérer le CurrentItem ?

    Je pense ne pas utiliser le MVVM correctement...

    Cordialement MoZo

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Oula.

    Normalement je ferais un truc dans le genre :

    Un MainViewModel avec ta collection pis un SelectedPerson bindé sur le SelectedItem de ta ListBox.

    Lorsque le SelectedPerson change tu utilses le Messenger (si tu utilises MVVM Light) pour communiquer avec le DetailViewModel et lui donner la nouvelle personne selectionnée. Le DetailViewModel a lui aussi une propriété SelectedPerson.

    Ta DetailView est bindée sur sa propre ViewModel et ses controles sont bindées sur la propriété SelectedPerson (qui aura été changé via le Messenger).

  3. #3
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Ok merci Skyounet,

    Une communication telle que tu la décris est donc impossible sans l'utilisation d'une librairie comme MVVMlight ?

    Cordialement MoZo

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Si si tu peux te créer ta propre classe Messenger c'est pas vraiment difficile.

    Il faut 2 méthodes : Send et Register.

    La première prend en paramètre un string (genre "PersonChanged") et un paramètre (donc ici ta personne par exemple), la deuxième prend en paramètre un string (PersonChanged) et une Action (le truc à effectué quand on reçoit la "commande" (donc dans ton cas mettre la paramètre dans ta propriété SelectedPerson).

  5. #5
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Merci, je tente ça alors . Au pire je vais aller voir du coté de MVVMLight !

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

Discussions similaires

  1. Problem du Details View
    Par genius4evers dans le forum ASP.NET
    Réponses: 2
    Dernier message: 18/02/2011, 16h40
  2. insérer un gridview dans un details view
    Par tatayet_le_felee dans le forum ASP.NET
    Réponses: 1
    Dernier message: 12/10/2009, 10h26
  3. Details view et modeChanging
    Par topolino dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/07/2009, 09h13
  4. Réponses: 5
    Dernier message: 01/06/2008, 07h28
  5. [2.0] Validation summary dans detail view
    Par CUCARACHA dans le forum ASP.NET
    Réponses: 1
    Dernier message: 28/05/2008, 15h55

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