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 - Data biding / Rafraichissement [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut WPF - Data biding / Rafraichissement
    Bonjour,
    je débute en WPF et je rencontre un problème avec la notion de Data binding / rafraichissement.
    Je n'arrive pas à mettre à jour l'affichage du contenu d'une barre d'état lors d'un traitement long.

    J'ai défini ma barre de cette manière:

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            <StatusBar Grid.Row=" 2" MinHeight="20">
                <StatusBarItem>
                    <TextBlock x:Name="lblMessage" Text="{Binding Message,UpdateSourceTrigger=PropertyChanged }" />
                </StatusBarItem>
            </StatusBar>

    Dans mon model 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
     
        public class ViewModel : INotifyPropertyChanged
        {
            private string _Message;
     
            public string Message
            {
                get { return _Message; }
     
                set
                {
                    if (_Message == value) return;
                    _Message = value;
                     OnPropertyChanged("Message");
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            protected virtual void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(name));
                }
            }
        }

    Et dans le "code behind" j'ai ceci :

    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
    public partial class MainWindow : Window 
    {
     
    	ViewModel MsgInfo;
     
    	public MainWindow()
    	{
    		InitializeComponent();
                    MsgInfo = new Models.ViewModel() { Message = "Pas d'action en cours."};
    		this.DataContext = MsgInfo;
    	}
     
    	public void btnTraitementLong_Click(object sender, RoutedEventArgs e)
    	{
    		MsgInfo.Message = "Début du traitement";
    		// Ici du code qui peut durer plusieurs secondes
    		// ...
     
                    MsgInfo .Message = "traitement étape 2";
    	        // Ici du code qui peut durer plusieurs secondes
    		// …
     
    		MsgInfo .Message = "traitement étape 3";
    		// Ici du code qui peut durer plusieurs secondes
    		// …
     
    		MsgInfo .Message = "Fin du traitement";
    	}
    }

    Au lancement de l'application, la barre d'état m'affiche bien "Pas d'action en cours". Lorsque je clique sur mon bouton, le code se déroule correctement sauf que le texte qui doit m'indiquer les différentes étapes n'est pas mis à jour.
    J'ai beau chercher, cela doit être gros comme une maison, mais je n'arrive pas à voir où se trouve la faille.
    quelqu'un peut m'aider ?

    Merci d'avance !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Manifestement, ma question n'inspire pas grand monde…
    Je vais regarder la notion de "Binding Async", peut être que cela répondra en parti à ma question ?…

  3. #3
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Salut. Quelques remarques :

    1- Tu n'as pas besoin de spécifier UpdateSourceTrigger=PropertyChanged, WPF devrait normalement s'en sortir tout seul.

    2- Évite le code behind, c'est comme ça qu'on faisait en WinForm, mais en WPF ça fait très crade ; pour gérer le click d'un bouton utilise un objet ICommand dans le ViewModel (chercher RelayCommand de MVVMLight).

    3- Il est tout à fait normal que la fenêtre ne se mette pas à jour. Il faut que tu te renseignes sur les Thread, notamment concernant les GUI ; pour résumer :
    - l'application se lance avec un Thread principal qui gère la GUI et les interactions utilisateur (click bouton, déplacement souris, etc.) ;
    - l'application peut rafraîchir l'interface tant qu'elle n'a rien d'autre à faire ;
    - si tu lances un traitement long l'application l'application ne sera pas en mesure de rafraîchir l'interface jusqu'à ce qu'elle ait fini de gérer l'événement ; c'est pourquoi on ne met pas de traitement long en réponse à un événement ;
    - ton code s'exécute sur le Thread de l'UI et je parierais que ton application se freeze pendant ce temps ; il faut que tu démarres tes traitements long dans des Thread secondaires, afin de ne pas bloquer l'UI ; pour cela regarde du côté de BackgroundWorker, Task et async/await.

    Bref il y a un peu de lecture de documentation en perspective. Tu auras sûrement d'autres questions au fur et à mesure que tu découvres de nouveaux concepts, n'hésite pas à poster à nouveau. Bon courage pour la suite

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci Noxen pour tes remarques.

    Pour le UpdateSourceTrigger=PropertyChanged, en effet je me suis rendu compte de cela.
    J'ai plus ou moins deviné que tant que le traitement du click n'était pas terminé, la GUI ne pouvait pas faire autre chose.

    J'ai lu quelque part qu'il valait mieux privilégier l'utilisation de Task plutôt que celle d'un
    BackgroundWorker. Voilà un autre sujet qu'il me faut approfondir.

    Je te remercie pour ton intervention, c'est clair qu'il me reste encore pas mal de lecture et de tests à faire avant de poser de nouvelles questions.

    En tout cas, Merci !

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

Discussions similaires

  1. data biding et expression
    Par mapmip dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/12/2009, 09h29
  2. Réponses: 4
    Dernier message: 18/11/2008, 15h51
  3. rafraichissement data Combo
    Par gentelmand dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/04/2007, 12h56
  4. Réponses: 5
    Dernier message: 22/03/2007, 08h32
  5. Petit cours pour éviter l'envoi POST data d'un formulaire apres un rafraîchissement
    Par maximenet dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 8
    Dernier message: 07/10/2006, 00h03

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