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

Silverlight Discussion :

IConverter sur DateTime


Sujet :

Silverlight

  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 54
    Par défaut IConverter sur DateTime
    Bonsoir,

    alors voila mon problème est simple j'ai un DateTime que je dois décomposer de la façon suivante:
    - DatePicker: La Date (Ça c'est ok)
    - TextBox: Le nombre d'heure.
    - TextBox: Le nombre de minute.

    Alors pour l"instant j'ai créé deux converter un pour les heures et un pour les minutes et je les affiche correctement mon problème c'est pour le Convertback. Est-ce que sur mon textblock Heure je vais pouvoir au convert back avoir toujours toutes les infos sur ce DateTime ou je vais perdre le reste(Minute,Date..) et ne récupérer que le nombre d'heure(ce qui me parait le plus probable)?

    En partant sur le fait que ça ne fonctionnera pas aussi facilement pour l'instant ma solution est de recréer le DateTime complet avec les trois parties (en cliquant sur un bouton Ok un peu plus bas).

    Si quelqu'un a une meilleure solution et/ou une réponse à ma première question. Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu ne vas pas t'en sortir avec des Converter, car il n'est pas possible de reconstituer la date à partir de seulement les heures ou seulement les minutes...

    Est-ce que tu utilises le pattern MVVM ? Si oui, le plus simple est d'exposer des propriétés distinctes dans ton 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    // La "vraie" date
    private DateTime _date;
    public DateTime Date
    {
        get { return _date;}
        set
        {
            if (value != _date)
            {
                _date = value;
                OnPropertyChanged("Date");
            }
        }
    }
     
    // Le jour (sans l'heure), bindé au DatePicker
    public DateTime DateWithoutTime
    {
        get { return _date.Date;}
        set { Date = MakeDate(value, _date.Hour, _date.Minute); }
    }
     
    // Les heures, bindées à un TextBox
    public int Hours
    {
        get { return _date.Hour;}
        set { Date = MakeDate(_date, value, _date.Minute); }
    }
     
    // Les minutes, bindées à un TextBox
    public int Minutes
    {
        get { return _date.Minute;}
        set { Date = MakeDate(_date, _date.Hour, value); }
    }
     
    private static DateTime MakeDate(DateTime date, int hours, int minutes)
    {
        return date.Date.AddHours(hours).AddMinutes(minutes);
    }

    En MVVM, c'est souvent beaucoup plus simple de travailler directement dans le ViewModel que d'utiliser des Converters, en tous cas dans ce genre de situations...

    Si tu n'utilises pas MVVM, je te suggère de te créer une classe avec les propriétés ci-dessus, et de binder tes contrôles dessus

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 54
    Par défaut
    Salut merci pour cette réponse rapide,

    j'utilise bien le pattern MVVM et ton idée ne m'est pas venue à l'esprit, en effet c'est le meilleur moyen mais maintenant un autre problème me vient a l'esprit j'ai une dizaine de DateTime de ce type et je pense que je risque de charger a bloc mon ViewModel.
    La première idée qui me vient est de créer un template. Qu'en penses tu?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Déjà, si c'est quelque chose que tu vas devoir faire souvent, tu aurais sans doute intérêt à créer un DateTimeViewModel, avec les propriétés que je t'ai montrées, ça évitera de copier/coller pour chaque date à éditer...

    Et tu peux effectivement créer un DataTemplate pour le DateTimeViewModel, avec le DatePicker et les 2 textbox. Ensuite, pour mettre un éditeur de date et d'heure il suffira de faire ça :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <ContentControl Content="{Binding LaDate}" />
    avec LaDate qui renvoie un DateTimeViewModel

    Avec WPF ça marche direct, avec SL je suis pas sûr qu'il trouve automatiquement le DataTemplate qui va bien... (peut-être que oui depuis SL4). Sinon il suffit de spécifier explicitement la propriété ContentTemplate...

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 54
    Par défaut
    J'ai un peu de mal a savoir ou je dois placer quoi.
    1) Deja, je vais avoir une instance DateTimeViewModel pour chaque appel de mon template?
    2) Si oui, comment ça se passe au niveau du locator?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ContentControl Content="{Binding LaDate}" />
    3 ) Ca si je ne me trompe pas c'est au niveau de l'appel de mon template?

    4) Si ça fonctionne comme en WPF et que je n'ai rien d'autre a toucher comment je recupere cette valeur dans le viewmodel de mon template?

    Je suis visiblement pas aussi a l'aise avec le concept que je le pensais..

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Avec WPF ça marche direct, avec SL je suis pas sûr qu'il trouve automatiquement le DataTemplate qui va bien... (peut-être que oui depuis SL4)
    Non, les Implicit DataTemplate seront dispos avec SL5 normalement.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par morgan2b Voir le message
    1) Deja, je vais avoir une instance DateTimeViewModel pour chaque appel de mon template?

    2) Si oui, comment ça se passe au niveau du locator?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ContentControl Content="{Binding LaDate}" />
    3 ) Ca si je ne me trompe pas c'est au niveau de l'appel de mon template?

    4) Si ça fonctionne comme en WPF et que je n'ai rien d'autre a toucher comment je recupere cette valeur dans le viewmodel de mon template?

    Je suis visiblement pas aussi a l'aise avec le concept que je le pensais..
    Euh... je comprends pas trop tes questions
    Je ne vois pas trop ce que tu entends par "appel du template", et de quel "locator" tu parles...
    Il n'y a pas de "ViewModel de ton template", c'est plutôt le contraire... il y a un DataTemplate spécifique pour le ViewModel (défini dans les ressources de l'application par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <DataTemplate x:Key="dateTimeTemplate" DataType="{x:Type vm:DateTimeViewModel}">
        <StackPanel Orientation="Horizontal">
            <DatePicker SelectedDate="{Binding DateWithoutTime}" />
            <TextBox Text="{Binding Hours}" />
            <TextBox Text="{Binding Minutes}" />
        </StackPanel>
    </DataTemplate>
    Et pour l'utiliser dans une page ou un UserControl, tu fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ContentControl Content="{Binding LaDate}" ContentTemplate="{StaticResource dateTimeTemplate}" />
    Du côté du ViewModel de ta page, tu exposes les dates sous forme d'un DateTimeViewModel :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private DateTimeViewModel _laDate = new DateTimeViewModel();
    public DateTimeViewModel LaDate
    {
        get { return _laDate; }
    }
    Et pour récupérer la valeur DateTime, tu utilises simplement _laDate.Date

  8. #8
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 54
    Par défaut
    Bonjour,

    alors voila comment j'ai resolu mon probleme:

    Coté PagePrincipale.xaml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ControleDateTime:DateTimeTextControl DataContext="{Binding HoursArr, Mode=TwoWay, Converter={StaticResource TimeTextBoxConverter}}"/>
    Coté TimeTextBoxConverter

    J'instancie mon DateTimeTextViewModel

    Coté DateTimeTextViewModel

    J'utilise le "système" de tomlev c'est a dire les trois variables et la méthode.

    Avantage: Toujours pas de code Behind dans ma page.

    Inconvenient: ??? A vous de me dire

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

Discussions similaires

  1. [BO 5] Condition sur DateTime
    Par barnard dans le forum Deski
    Réponses: 5
    Dernier message: 22/01/2008, 14h04
  2. [.NET C# VS2005] Question sur DateTime.Substract
    Par NeraOne dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/05/2007, 11h52
  3. Ecart type sur Datetime
    Par chicken92000 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/02/2007, 15h16
  4. [SqlSrv 2K] Index sur DateTime
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/06/2006, 15h03
  5. Index sur datetime ne fonctionnant pas
    Par Pierrinot dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/10/2004, 09h10

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