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 :

WPF MVVM Binding Refresh


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 137
    Par défaut WPF MVVM Binding Refresh
    Bonjour,

    Dans un user control, j'ai un bouton et une listview.

    Au démarrage de l'application, la listeview est remplie via Binding avec un ViewModel.

    Sur le bouton (via une Command), je souhaite pouvoir changer le contenu de ma listeview.

    Le binding de ma listview qui fonctionne bien au démarrage
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <ListView MouseDoubleClick="ListView_MouseDoubleClick" ItemsSource="{Binding Actions, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="lstAct" Margin="0,50,0,0" SelectionChanged="ListView_SelectionChanged">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="50" Header="Col 1" DisplayMemberBinding="{Binding Denomination, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Width="50" Header="Col 2" DisplayMemberBinding="{Binding Derniere_Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Width="50" Header="Col 3" DisplayMemberBinding="{Binding Frequence_periode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </GridView>
                </ListView.View>
     
            </ListView>

    Le code dans le ViewModel
    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
        public class GlobViewModel
        {
     
            public ObservableCollection<clsAction> Actions { get; set; }
            int id = 0;
     
            public GlobViewModel(int myPt)
            {
     
                Actions = new ObservableCollection<clsAction>();
                id = myPt;
                Actions = new DAOAction().getOCAllActionForOnePoint(id);
     
            }
     
            private RelayCommand detailCommand;
            public ICommand DetailCommand
            {
                get { return detailCommand ?? (detailCommand = new RelayCommand(() => DetailAction())); }
            }
     
            private void DetailAction()
            {
                Actions = new DAOAction().getOCAllActionForOnePoint(223);
            }
        }

    Dans DetailAction, je modifie "Actions" (ca passe bien dedans) mais ma listview n'est pas mise-à-jour

    Merci pour votre aide

    Gridin

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 137
    Par défaut
    Petit oubli mais ca ne change rien à mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class GlobViewModel : BaseViewModel
    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
     
    using System.ComponentModel;
    using System.Diagnostics;
     
        public abstract class BaseViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
     
            [Conditional("DEBUG")]
            [DebuggerStepThrough]
            public void VerifyPropertyName(string propertyName)
            {
                if (TypeDescriptor.GetProperties(this)[propertyName] == null)
                {
                    Debug.Fail("Invalid property name: " + propertyName);
                }
            }
     
            protected virtual void OnPropertyChanged(string propertyName)
            {
                this.VerifyPropertyName(propertyName);
     
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par gridin Voir le message
    Bonjour,

    Dans un user control, j'ai un bouton et une listview.

    Au démarrage de l'application, la listeview est remplie via Binding avec un ViewModel.

    Sur le bouton (via une Command), je souhaite pouvoir changer le contenu de ma listeview.

    Le binding de ma listview qui fonctionne bien au démarrage
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <ListView MouseDoubleClick="ListView_MouseDoubleClick" ItemsSource="{Binding Actions, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="lstAct" Margin="0,50,0,0" SelectionChanged="ListView_SelectionChanged">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="50" Header="Col 1" DisplayMemberBinding="{Binding Denomination, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Width="50" Header="Col 2" DisplayMemberBinding="{Binding Derniere_Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Width="50" Header="Col 3" DisplayMemberBinding="{Binding Frequence_periode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                    </GridView>
                </ListView.View>
     
            </ListView>

    Le code dans le ViewModel
    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
        public class GlobViewModel
        {
     
            public ObservableCollection<clsAction> Actions { get; set; }
            int id = 0;
     
            public GlobViewModel(int myPt)
            {
     
                Actions = new ObservableCollection<clsAction>();
                id = myPt;
                Actions = new DAOAction().getOCAllActionForOnePoint(id);
     
            }
     
            private RelayCommand detailCommand;
            public ICommand DetailCommand
            {
                get { return detailCommand ?? (detailCommand = new RelayCommand(() => DetailAction())); }
            }
     
            private void DetailAction()
            {
                Actions = new DAOAction().getOCAllActionForOnePoint(223);
            }
        }

    Dans DetailAction, je modifie "Actions" (ca passe bien dedans) mais ma listview n'est pas mise-à-jour

    Merci pour votre aide

    Gridin
    Essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void DetailAction()
            {
                Actions.Clear();
                Actions.AddRange(new DAOAction().getOCAllActionForOnePoint(223));
            }

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 137
    Par défaut
    AddRange ???

    Cela n'existe pas.

    Le DAO retourne une ObservableCollection<clsAction>

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par gridin Voir le message
    AddRange ???

    Cela n'existe pas.

    Le DAO retourne une ObservableCollection<clsAction>
    Flute, c'est juste sur List<T>
    Bon ben alors deux solutions!

    En fait ton problème est lorsque tu fais : Actions = new DAOAction().getOCAllActionForOnePoint(223);
    Tu ne changes pas le contenu mais tu remplaces le contenant par un autre contenant! Alors soit tu réutilises l'ancien contenant (ce que j'ai essayé de faire mais faut utiliser un foreach en fait) soit tu fais un RaisePropertyChanged sur Actions

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 137
    Par défaut
    Tu peux m'aider avec du code pour RaisePropertyChanged

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 657
    Par défaut
    Rapidement :

    dans le setter d' Action tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    _actions = value ;
    OnPropertyChange("Actions");
    et surtout créer un field private _actions , puisque tu changes (reset) ta collection entièrement et pas juste un item de ta collection.

    ou alors ne surchage pas Actions , mais efface la collection avec Clear() et ensuite tu ajoutes une autre collection ( je ne me souviens plus de la méthode ).

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 137
    Par défaut
    Super voilà ce que j'ai changé dans le viewmodel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     private ObservableCollection<clsAction> _Actions;
            public ObservableCollection<clsAction> Actions
            {
                get { return _Actions;} 
                set
                {
                    _Actions = value;
                    OnPropertyChanged("Actions");
                } 
            }
    Et ca fonctionne

    MERCIIIIIIIIIIIIIIIIIIIIIII

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2011, 11h44
  2. [WPF][MVVM] GridView bindé un ReadOnlyCollection
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 07/09/2010, 10h58
  3. [WPF - Blend] Binding lié à un click button
    Par OS_trimble dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 06/12/2007, 14h28
  4. [WPF][triggers] binding sur un DataView?
    Par bakonu dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 26/10/2007, 09h25
  5. [WPF] UserControl -> binding ??
    Par UNi[FR] dans le forum C#
    Réponses: 1
    Dernier message: 10/09/2007, 11h31

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