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 :

Binding sur TextBlock [Débutant]


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Par défaut Binding sur TextBlock
    Bonjour
    Je tente sans succès depuis des jours, de mettre en place le mécanisme suivant.
    Au chargement de mon appli, j'affiche un splashscreen contenant un TextBlock qui est censé afficher un texte informant du traitement en cours sur la MainWindow (le chargement des données peut prendre plusieurs dizaines de secondes). Je tente d'utiliser le binding pour ça.

    J'ai mis en place le mécanisme suivant.
    Code XAML du splashscreen
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock Text="{Binding Path=TexteDeroulement}"/>
    Dans le code-behind du splashscreen
    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
    public partial class FenetreSplashScreen : Window, INotifyPropertyChanged
      {
        public event PropertyChangedEventHandler PropertyChanged;
        private void FirePropertyChanged(string name)
        {
          if (this.PropertyChanged!=null)
          {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
          }
        }
     
        private string _TexteDeroulement;
        public string TexteDeroulement
        {
          get { return this._TexteDeroulement; }
          set
          {
            if (this._TexteDeroulement!=value)
            {
              this._TexteDeroulement = value;
              this.FirePropertyChanged("TexteDeroulement");
            }
          }
        }
    Problème, si je mets à jour TexteDeroulement dans la fenêtre Splashscreen, l'affichage se met bien à jour, mais si je le fais dans la mainwindow (à laquelle j'ai passé une référence sur la fenêtre splashscreen), l'affichage ne le prend pas en compte. Et je ne comprends pas pourquoi.
    Quelqu'un peut m'aider ?

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ce code me semble bon, quel est le code qui passe la référence du window ?
    tu as mis un point d'arret sur le fire dans le set de la propriété pour être sur que tu y passes dans le cas où ca ne marche pas ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Par défaut
    Oui, j'ai vérifié avec un point d'arrêt.
    La mainwindow et le splashscreen sont créés par code dans le App.xaml.cs
    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
    public partial class App : Application
      {
        private FenetreSplashScreen Splashscreen;
     
        public App()
        {
          this.MainWindow = new FenetrePrincipale();
     
          FenetrePrincipale fenetrePrincipale =(FenetrePrincipale) this.MainWindow;
     
          this.Splashscreen = new FenetreSplashScreen();
          fenetrePrincipale.Splashscreen = this.Splashscreen;
          this.Splashscreen.Show();
        }
     
        protected override void OnStartup(StartupEventArgs e)
        {
          base.OnStartup(e);
     
          this.MainWindow.Show();
     
          this.Splashscreen.Close();
          this.Splashscreen = null;
        }
      }
    Et dans la mainwindow
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public partial class FenetrePrincipale : Window
      {
        private FenetreSplashScreen splashScreen;
        public FenetreSplashScreen Splashscreen { set { splashScreen = value; } }

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ce code me semble bon aussi
    t'as pas de chance ...



    et donc quand depuis fenetreprincipale tu fais splash.Textederoul = "newvalue" tu passes bien sur le firepropchanged ?
    (il reste ce code que tu nous ne montre pas, genre si c'est depuis un autre thread ca pourrait être logique que ca ne fonctionne pas)

    après tu peux aussi mettre un point d'arret sur le constructeur de splashwindow pour être sur que tu n'y passes qu'une fois
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Par défaut
    Pourquoi faire du Binding sur un DataContext qui est le composant lui même ? Ou alors avec une DependencyProperty mais surtout pas avec INotifyPropertyChanged


    - Soit tu fait un SplashScreenViewModel (qui implémente INotifyPropertyChanged avec ta propriété dedans), tu définit le DataContext de FenetreSplashScreen -> SplashScreenViewModel et la c'est le MVVM standart (mais pas vraiment d'utilité à ce niveau la de l'application).

    - Soit tu met à jour directement le texte du champ texte dans le code Behind de FenetreSplashScreen via une méthode par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SetTexteDeroulement(string message)
    {
        this.nomDuChampTextDansLeXaml.Text = message;
    }
    En plus tu supprime une variable (_TexteDeroulement) et une propriété (TexteDeroulement) qui n'as pas réellement de raison d'être car elle n'est pas lu ni écrite par un autre biais, et tu n'as plus besoins d'implémenté INotifyPropertyChanged.


    Sinon il n'y as pas une histoire de Thread ou de Task dans ton initialisation ?, si le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.PropertyChanged(this, new PropertyChangedEventArgs(name));
    se déroule dans le contexte d'un autre Thread que celui de l'UI c'est normal que l'UI n'affiche pas la modification.

  6. #6
    Membre confirmé
    Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Par défaut
    J'ai essayé la mise à jour comme tu le proposes avec la méthode SetTexteDeroulement, mais même problème, pas d'affichage du texte.

    Après, je ne suis pas certain d'utiliser la bonne méthode pour arriver à mes fins. Je tâtonne. A la base mon problème est que j'ai une mainwindow qui met du temps à charger des données. Je veux afficher une fenêtre en avant-plan qui accueille l'utilisateur, et lui affiche du texte l'informant du déroulement du traitement en cours.

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par champy Voir le message
    Pourquoi faire du Binding sur un DataContext qui est le composant lui même ?
    pour éviter d'avoir à nommer des controles et de lier l'interface au code behind ? (même si c'est pas du M et que la classe sert de VM ca reste du code behind)

    Citation Envoyé par champy Voir le message
    Ou alors avec une DependencyProperty mais surtout pas avec INotifyPropertyChanged
    dependency est plus performant (beaucoup ?) ? autre raison ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre confirmé
    Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    et donc quand depuis fenetreprincipale tu fais splash.Textederoul = "newvalue" tu passes bien sur le firepropchanged ?
    (il reste ce code que tu nous ne montre pas, genre si c'est depuis un autre thread ca pourrait être logique que ca ne fonctionne pas)
    Dans le Window_Loaded de FenetrePrincipale j'instancie une classe qui charge des données, et juste avant je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    splashScreen.TexteDeroulement="blablabla";
    Je ne passe bien qu'une fois dans le constructeur de splashscreen.

    Mon problème me semble basique, mais comme je dis, je ne suis pas certain de le prendre par le bon bout. Je démarre en WPF, et j'ai beaucoup de réflexes winforms. J'essaie de reproduire ce que j'ai déjà fait en winforms, par utilisation de délégués pour la mise à jour de l'affichage. Je pensais qu'en WPF la bonne méthode était celle que je tente de mettre en place. Si je me fourvoie, et qu'il faut faire autrement, n'hésitez pas à me recadrer.

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    si tu parles de délégué c'est que tu es sur un autre thread, auquel cas c'est le même principe, sauf que c'est par dispatcher qu'il faut passer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Un Binding sur TextBlock qui avait l'air simple
    Par alexadvance dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 18/08/2009, 09h57
  2. [TextBlock] Probleme de binding sur du texte formaté
    Par Bruno.Chappe dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 10/05/2009, 16h03
  3. [xaml] Bind sur le titre d'une page
    Par despeludo dans le forum Framework .NET
    Réponses: 6
    Dernier message: 21/03/2007, 09h07
  4. Méthode Bind sur quoi
    Par frouty dans le forum wxPython
    Réponses: 4
    Dernier message: 18/11/2006, 00h24
  5. binding sur une string
    Par fxp17 dans le forum JSF
    Réponses: 8
    Dernier message: 08/09/2006, 11h38

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