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 :

Notifié le ViewModel à modification d'une propriété d'une instance [MVVM]


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Par défaut Notifié le ViewModel à modification d'une propriété d'une instance
    Bonjour.

    J'ai dans un premier temps un formulaire de données client. Celui-ci possède une Grid pour laquelle j'ai mis en DataContext l'instance de mon client récupérer de mon ViewModel.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <UserControl ...>
        <UserControl.DataContext>
            <ViewModels:MyViewModel />
        </UserControl.DataContext>
     
        <Grid>
            <Grid DataContext="{Binding Path=Customer}">
                <TextBox Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}" />
            </Grid>
            <Button Command="{Binding Path=SaveCommand}" />
        </Grid>
    </UserControl>

    Le problème est que la modification de la propriété FirstName de mon Client ne se répercute pas. J'ai placer un point d'arrêt dans le setter mais il ne passe pas à l'intérieur.

    Code csharp : 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
     
    public class MyViewModel : NotificationObject
    {
        public MyViewModel()
        {
            this.SaveCommand = new DelegateCommand(this.Save, this.CanSave);
        }
     
        public ICustomer Customer
        {
            get { return this.customer; }
            set
            {
                this.customer = value;
                this.SaveCommand.RaiseCanExecuteChanged();
            }
        }
     
        public DelegateCommand SaveCommand { get; private set; }
     
        public bool CanSave()
        {
            return this.Customer != null && !string.IsNullOrWhiteSpace(this.Customer.FirstName)
        }
     
        public void Save ()
        {
        }
    }

    Pour info, je travail avec les bibliothèque de Prism pour la gestion MVVM.

    Merci de votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 056
    Par défaut
    Il faut préciser que le BindingMode=TwoWay.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Par défaut
    Mode TwoWay ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataContext="{Binding Path=Customer, Mode=TwoWay}"
    Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

  4. #4
    Membre éprouvé
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Par défaut
    Dans ton code je ne vois aucun appel du genre NotifyPropertyChanged ou RaisePropertyChanged pour dire à ta vue que le contexte a changé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public ICustomer Customer
        {
            get { return this.customer; }
            set
            {
                this.customer = value;
                RaisPropertyChanged("Customer");
                this.SaveCommand.RaiseCanExecuteChanged();
            }
        }

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Par défaut
    Certes en effet je n'ai pas mis ce code, mais celui-ci ne sert qu'à mettre à jour du ViewModel vers la View. Hors mon problème se situe dans l'autre sens.

  6. #6
    Membre éprouvé
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Par défaut
    Tu peux mettre le code de ta classe Customer ? J'imagine que ça doit ressembler à ça :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Customer : ICustomer
    {
            private string _firstName;
            public string FirstName
            {
                get { return _firstName; }
                set
                {
                    _firstName= value;
                    RaisePropertyChanged("FirstName");
                }
            }
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/12/2013, 00h05
  2. Réponses: 10
    Dernier message: 23/03/2011, 16h10
  3. Réponses: 10
    Dernier message: 01/12/2010, 08h26
  4. Binding sur une proprité d'une propriété
    Par al2000 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 21/06/2010, 17h24
  5. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43

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