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 :

Databinding sur une méthode ou une méthode d'une classe étendue


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut Databinding sur une méthode ou une méthode d'une classe étendue
    Bonjour,

    pour un projet , j'ai besoin de faire un binding sur la date d'un objet MailMessage.

    La date se récupère comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string sDateExemple;
     
    foreach (MailMessage currentMessage in Messages)
    {
    string s = currentMessage.Headers.Get("Date");
    }
    Dans le code xaml de mon listview j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <GridViewColumn Width="100" Header="Date:" DisplayMemberBinding="{Binding Headers.Get("Date")}"/>
    Mais j'ai plusieurs erreurs.

    J'ai donc testé en passant par un extend de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    namespace MailMessageExtension
    {
        public static class MailMessageExtension
        {
            public static string GetDateMessage(this MailMessage pMsg)
            {
                return pMsg.Headers["Date"];
            }
        }
    }
    Et le code xaml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <GridViewColumn Width="100" Header="Date:" DisplayMemberBinding="{Binding GetDateMessage()}"/>
    Là, pas d'erreur mais pas de résultat à l'affichage non plus. Une idée ?
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  2. #2
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Bonjour,

    Binder sur une méthode, je n'ai jamais eu à faire ca.J'imagine que ca peux se faire en passant la méthode dans un ConverterParameter.

    Cependant le binding sur une propriété fonctionne trés bien, qu'est qui t'empêche de créer une propriété qui appelle la méthode ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public string Date
    {
       get
       {
          return GetDate(); // parametres ou pas , c'est toi qui voit
       }
    }
    DisplayMemberBinding="{Binding Date}" // ou Headers.Date , c'est selon ou tu as placé la propriété
    Bon code.
    throw new NoSignatureException();

  3. #3
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Merci pour ta réponse rapide.

    J'y ai pensé, mais dans le cas de l'extension de la classe MailMessage, l'extension se fait par une classe static.

    Donc je ne peux pas appeler ma méthode car il faudrait que je lui passe un argument que que this n'est pas reconnu vu "static" :

    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
     
     public static class MailMessageExtension
        {
            public static string DateMessage
            {
                get
                {
                    return GetDateMessage(this);
                }
            }
            public static string GetDateMessage(this MailMessage pMsg)
            {
                return pMsg.Headers["Date"];
            }
        }
    ou

    Nom : Sans titre.jpg
Affichages : 148
Taille : 49,9 Ko
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  4. #4
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    C'est quoi ton dataContext ?

    La propriété à Binder ne doit pas être dans la classe static mais dans celle du DataContext.
    throw new NoSignatureException();

  5. #5
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Dans mon cas j'essaie de faire un data binding (ListView) sur une liste de MailMessage :

    xaml :
    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
    29
    30
    31
     
    <ListView Name="LstvMessage"  HorizontalAlignment="Stretch" Margin="5,5,5,5" Grid.Row="1" VerticalAlignment="Stretch">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="HorizontalContentAlignment" Value="Left"/>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.View>
                    <GridView>
                        <GridView.ColumnHeaderContainerStyle>
                            <Style TargetType="{x:Type GridViewColumnHeader}">
                                <Setter Property="HorizontalContentAlignment" Value="Left" />
                            </Style>
                        </GridView.ColumnHeaderContainerStyle>
                        <GridViewColumn Width="300" Header="De:" DisplayMemberBinding="{Binding From}"/>
                        <GridViewColumn Width="300" Header="Sujet:" DisplayMemberBinding="{Binding Subject}"/>
                        <GridViewColumn Width="100" Header="Attachement(s):" DisplayMemberBinding="{Binding Attachments.Count}"/>
                        <GridViewColumn  >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Button Name="btnSave" HorizontalAlignment="Center"  VerticalAlignment="Center" Width="32" Height="32"  Click="btnSave_Click">
                                        <StackPanel>
                                            <Image Source="{StaticResource ResourceKey=IconSave}"  />
                                        </StackPanel>
                                    </Button>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
    avec remplissage de ma liste assez simple :

    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
     
     
            private void FillMessageList()
            {
                using (ImapClient client = new ImapClient(RechercheMailAttachement.Properties.Settings.Default.IMAPSERVEUR, 993, RechercheMailAttachement.Properties.Settings.Default.IMAPUTIL, RechercheMailAttachement.Properties.Settings.Default.IMAPPWD, AuthMethod.Auto, true))
                {
                    IEnumerable<MailMessage> Messages;
     
                    _LstMessages.Clear();
     
                    // TODO : Permettre la modification du nombre de jour pour la reprise des mails. 
                    IEnumerable<uint> uids = client.Search(/*SearchCondition.All()*/SearchCondition.SentSince(DateTime.Now.AddDays(-2)), "INBOX");
                    Messages = client.GetMessages(uids, FetchOptions.Normal, true, "INBOX");
     
                    foreach (MailMessage currentMessage in Messages)
                    {
                        if (currentMessage.Attachments.Count > 0)
                        {
                            _LstMessages.Add(currentMessage);
                        }
                    }
     
                    LstvMessage.ItemsSource = _LstMessages;
                }
            }
    La classe MailMessage fait partie du framework :

    https://docs.microsoft.com/en-us/dot...ramework-4.7.2

    Par contre pour obtenir la date il faut faire le [objet MailMessage].Headers.Get("Date") ce que le binding en xaml n'apprécie pas.

    D'où l'idée de faire une classe d'extension, mais je n'arrive pas à lier ma méthode (ni une propriété éventuelle)

    J'étais pas très clair je pense au début du post ;-)
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    un binding ne peut se faire que sur une propriété
    Headers.Get est une méthode

    il faut donc que tu fasses une classe avec les propriétés dont tu as besoin et qui sera remplie à partir d'un mailmessage par code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    un binding ne peut se faire que sur une propriété
    Headers.Get est une méthode

    il faut donc que tu fasses une classe avec les propriétés dont tu as besoin et qui sera remplie à partir d'un mailmessage par code
    C'est bien ce qui me faisait peur. Cela ne me pose pas de soucis mais je voulais voir s'il n'y avait pas une autre solution.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

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

Discussions similaires

  1. [XL-2010] Générer une liste de dates à partir d'une date de début et d'une date de fin
    Par morgan75 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/06/2017, 11h39
  2. Réponses: 9
    Dernier message: 26/10/2016, 15h07
  3. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  4. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  5. Réponses: 2
    Dernier message: 06/07/2009, 09h45

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