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 :

Command et databinding avec Silverlight 3


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut Command et databinding avec Silverlight 3
    bonjour

    j'essaye de mettre en place une petite appli test pour découvrir Silverlight et MVVM.

    Seulement voila je ne trouve pas énormément de sources potables d'appli exemples en Silverlight 3.

    J'essaye de mettre en place un tableau de personnes avec un bouton rafraichir, jusque là tout va bien.

    Déjà, je souhaite utiliser un ViewModel statique de mon Locator pour créer le datacontext de ma page xaml, parfait je trouve des exemples, malheureusement en WPF, et ça donne, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext="{Binding Source={x:Static vm:Locator.PersonneViewModelStatic}}"
    Déjà, ce code ne fonctionne pas avec Silverlight. Y a t il un équivalent ?

    ensuite, je souhaite binder une command a mon bouton rafraichir, et là pareil, pas de propriété command pour ce composant (apparement en SL4 le "problème" est résolu). Je trouve ces exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Content="Save" Command="{Binding CommandRafraichir}" Width="120" Height="40" />
    comment faire le binding de mon boutton vers ma commandRafraichir ?

    merci

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Bonjour,

    Il me semble que Static n'existe pas en SL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext="{Binding Source={x:Static vm:Locator.PersonneViewModelStatic}}"
    Tu dois pouvoir remplacer par cela par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <Grid x:Name="LayoutRoot">
      <Grid.Resources>
        <vm:Locator.PersonneViewModel x:Name="MonViewModel"/>
      </Grid.Resources>
     
      <Button DataContext="{Bindind Source={StaticResource MonViewModel}}"/> 
     
    </Grid>

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    j'ai essayé mais ça ne marche pas, il ne connait pas la définition de mon locator.personnelViewModel

    voici le contenu de mon locator:
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    namespace AppliMVVM
    {
        public class Locator
        {
            public Locator()
            {
                CreatePersonnelViewModel();
            }
     
            public static void Dispose()
            {
                // Call ClearViewModelName() for each ViewModel.
            }
     
            #region PersonnelViewModel property
            private static PersonnelViewModel _personnelViewModel;
     
            /// <summary>
            /// Gets the PersonnelViewModel property.
            /// </summary>
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
                "CA1822:MarkMembersAsStatic",
                Justification = "This non-static member is needed for data binding purposes.")]
            public PersonnelViewModel PersonnelViewModel
            {
                get
                {
                    return PersonnelViewModelStatic;
                }
            }
     
            /// <summary>
            /// Gets the PersonneViewModel property.
            /// </summary>
            public static PersonnelViewModel PersonnelViewModelStatic
            {
                get
                {
                    if (_personnelViewModel == null)
                    {
                        CreatePersonnelViewModel();
                    }
     
                    return _personnelViewModel;
                }
            }
     
            /// <summary>
            /// Provides a deterministic way to create the PersonneViewModel property.
            /// </summary>
            public static void CreatePersonnelViewModel()
            {
                _personnelViewModel = new PersonnelViewModel();
            }
     
            /// <summary>
            /// Provides a deterministic way to delete the PersonneViewModel property.
            /// </summary>
            public static void ClearPersonnelViewModel()
            {
                if (_personnelViewModel != null)
                {
                    _personnelViewModel.Dispose();
                    _personnelViewModel = null;
                }
            }
            #endregion
        }
    }
    j'ai essayé avec les noms exacts mais rien à faire.

    et puis je n'ai pas encore testé mais il y a une chose qui me semble bizare, c'est que mon ViewModel contient une collection de personnes et plusieurs commandes, mais dans le code que tu m'a écrit, comment binder mon bouton a mon ICommand ? car là ça binde uniquement sur mon ViewModel...

  4. #4
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    j'ai essayé mais ça ne marche pas, il ne connait pas la définition de mon locator.personnelViewModel
    Ce que je voulais te montrer c'est comment remplacer un x:Static par un StaticResource maintenant à toi d'adapter la chose à ton cas.

    Le membre PersonneViewModelStatic qui est static ne sera pas vu du Binding mais tu peux le passer en tant que propriété en faisant ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public PersonneViewModel PersonneViewModel
    {
      get
      {
        return PersonneViewModelStatic;
      }
    }
    et puis je n'ai pas encore testé mais il y a une chose qui me semble bizare, c'est que mon ViewModel contient une collection de personnes et plusieurs commandes, mais dans le code que tu m'a écrit, comment binder mon bouton a mon ICommand ? car là ça binde uniquement sur mon ViewModel...
    Ou se trouve ta commande ? si elle est statique elle ne sera pas vu du Binding donc pourquoi ne pas l'enlever ? Si la source du Binding ne correspond pas à ce que tu veux, change la

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    je vais réexpliquer mon problème plus en détails:

    au départ, j'ai voulu calquer mon application Silverlight sur un exemple d'applications WPF que j'avais vu, et dont le fichier XAML est le suivant:
    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
    <UserControl x:Class="WpfApplication1.PersonneModule.PersonneView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:WpfApplication1"
        DataContext="{Binding Source={x:Static vm:Locator.PersonneViewModelStatic}}">
     
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock Text="Nom" Grid.Row="0" VerticalAlignment="Center"/>
            <TextBlock Text="Prénom" Grid.Row="1" VerticalAlignment="Center"/>
     
            <TextBox Text="{Binding Personne.Nom}" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center"/>
            <TextBox Text="{Binding Personne.Prenom}" Grid.Row="1" Grid.Column="1" VerticalAlignment="Center"/>
     
            <Button Content="Save" Command="{Binding SaveCommand}" Grid.Row="2" Grid.ColumnSpan="2" Width="120" Height="40" />
     
            <TextBlock Text="Effacez le contenu du prénom pour voir..." Grid.Row="3" Grid.ColumnSpan="2" VerticalAlignment="Center"/>
        </Grid>
    </UserControl>
    cette page XAML fait appel à un locator pour obtenir une instance de son ViewModel, et appelle par la suite plusieurs propriétés publiques bindées dans des champs (Personne.Nom, Personne.Prenom, et SaveCommand qui est un ICommand et qui s'éxécutera au clic sur le bouton de sauvegarde).

    Mes deux soucis sont les suivants:
    * l'appel au datacontext de mon controlUser, pas sur les composants de ma page, mais bien sur mon controlUser entier.
    * l'équivalent du paramètre "Command" en Silverlight, car il n'est pas disponible pour un bouton.

    Pour te répondre samoteph, j'ai bien un getter public qui retourne mon ViewModel dans mon locator (cf le code de mon locator, j'ai les deux appels, le statique et le non statique).
    Et dans mon ViewModel, j'ai une ObservableCollection et trois ICommand, tous publiques, je ne sais juste pas la syntaxe pour appeler cette commande..

  6. #6
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Pour te répondre samoteph, j'ai bien un getter public qui retourne mon ViewModel dans mon locator (cf le code de mon locator, j'ai les deux appels, le statique et le non statique).
    j'avais pas vu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <Grid x:Name="LayoutRoot">
      <Grid.Resources>
        <vm:Locator x:Name="Locator"/>
      </Grid.Resources>
     
      <Button DataContext="{Bindind  PersonneViewModel, Source={StaticResource Locator}}"/> 
     
    </Grid>

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    bon je viens d'essayer ce code et ça ne marche toujours pas..
    the tag binding does not exist in XML namespace.
    je ne comprend pas la syntaxe exacte à utiliser

    je veux accéder a locator -> PersonnelViewModel -> RafraichirPersonnel (ICommand)..

    tu n'aurai pas un petit programme exemple en Silverlight qui utilise un locator, des icommand .. etc ça m'aiderai bien et je ne trouve que du WPF..

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Pour l'implémentation de ICommand en SL3 je te conseille MVVM Light de Laurent Brugnon :

    Un petit tuto de Nico dessus (regarde spécialement le chapitre 4.1)

    http://nico-pyright.developpez.com/t...t-silverlight/

    Pour revenir à notre souci de Binding :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Grid x:Name="LayoutRoot">
      <Grid.Resources>
        <vm:Locator x:Name="Locator"/>
      </Grid.Resources>
     
      <Button Content="Save" cmd:ButtonBaseExtensions.Command="{Bindind  Path=PersonneViewModel.RafraichirPersonnel, Source={StaticResource Locator}}"/> 
     
    </Grid>
    Ce qui est important de comprendre ici c'est la façon dont procède le Binding pour obtenir l'information.

    Tout d'abord avec le paramètre Source tu obtiens l'instance de Locator que tu as déclaré dans les ressources. Puis tu peux utiliser Path pour te balader dans la structure de Locator. Ainsi on va chercher les propriétés PersonneViewModel et enfin RafraichirPersonnel.

    C'est une façon de faire, il en existe d'autre...

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    ++ pour l'utilisation de MVVMlight!!

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    oui j'utilise bien le MVVM light toolkit pour mettre en place

    j'ai réussi a ajouter la référence à mon ViewModel au travers de mon locator:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataContext="{Binding PersonnelViewModelStatic, Source={StaticResource Locator}}"
    par contre je n'arrive pas encore a binder mon boutton à mon ICommand, à cause de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd:ButtonBaseExtensions.Command="{Binding rafraichir}"
    j'ai pourtant référencé les 3 binaires Galasoft et ajouté dans l'entête du userControl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"
    mais rien à faire il ne connait pas cmd:ButtonBaseExtensions .. des idées?

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Peut-être as-tu oublié d'ajouter le namespace de MvvmLight.Command. Moi j'ai 2 lignes dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xmlns:mvvmltk="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight"
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    oui j'ai trouvé l'erreur hier en effet . c'est bien le mvvmLight.Extras qui posait problème, car il ne contient pas le ButtonBaseExtension.. il fallait juste enlever le .Extras.

    merci

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

Discussions similaires

  1. [Visual Web] [VisualWeb] DataBinding avec Tomcat
    Par balmeyer dans le forum NetBeans
    Réponses: 14
    Dernier message: 02/05/2007, 15h04
  2. Réponses: 2
    Dernier message: 21/02/2007, 11h22
  3. executer une commande non perl avec perl
    Par kolombo dans le forum Langage
    Réponses: 17
    Dernier message: 07/08/2006, 11h28
  4. Command not found avec csh
    Par mavina dans le forum Linux
    Réponses: 2
    Dernier message: 25/04/2006, 13h47
  5. [C# .NET 2.0] Databinding avec ArrayList
    Par Sylvain James dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2006, 10h57

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