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 :

c# binding dynamique?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Par défaut c# binding dynamique?
    salut,

    je viens d'integrer le mode du WPF,et j'aurai besoin d'aide.

    j'essaye de creer des controls et de faire un binding dynamique sur une proprieté de ma viewmodel.cs

    mon code c#
    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
    public partial class UserControl1 : UserControl
              {
                  public UserControl1()
    	  {
    	    InitializeComponent();
    	    this.DataContext = new MyViewModel();
    	    this.Loaded += new RoutedEventHandle(UserControl_Loaded);
    	   }
     
    	private void UserControl_Loaded(object sender, RoutedEventArgs e)
    		{
    	                 List<Sport> sports = REcupSport();
                                  foreach (Sport spo in sports)
                                   {
    		  LayoutRoot.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
    		  TextBox textblockid = new TextBox();
    		  textblockid.SetValue(TextBox.MarginProperty, new Thickness(10));
    		  textblockid.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center);
    		  Binding myBinding = new Binding("MyDataProperty");
    		  myBinding.Source = this.DataContext;
    		  textblockid.SetBinding(TextBlock.TextProperty, myBinding);
    	               LayoutRoot.Children.Add(textblockid);
     
     
    		}
    lorsque j'essaye ce code les controls sont crees mais pas de binding????

    mais lorsque j'essaye uu binding sur Xaml ça marche

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{Binding Path=MyDataProperty, Mode=TwoWay}"
    des idées

  2. #2
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    A mon avis, le DataContext est null lorsque tu assignes la source et du coup, tu es bindé sur rien...

    Y-a-t'il d'autres messages d'erreurs dans la fenêtre d'output ?

    Bon courage,

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Par défaut
    Merci pour ta reponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = new MyViewModel();
    j'insatancie ma viewmodel dans le contructeur.
    dans un premier temps ça va etre vide mais aprés le click sur le bouton enregister normalement dois binder xaml avec ma propriété cs

    ce que je veux , lorsque je clique sur le bouton enregister :

    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
     
    
    	public event PropertyChangedEventHandler PropertyChanged;
    		private List<Sport> _sport;
    		private int _id0;
    		public ICommand SaveCommand { get; private set; }
    
               public Ecran1ViewModel()
                 {
    	 this._sport = new List<Sport>(); 
                  SaveCommand = new RelayCommand(o => OnSave(o));
                 }
    
            private void OnSave(object o)
            {
    	_sport.Add(new Sport(id0));        } 
    
             public int id0
    	 {
    	get
    	{
    	return _id0;
    	}
    	set
    	{
    	if (id0 != value)
    	{
    	_id0 = value;
    	if (PropertyChanged != null)
    	PropertyChanged(this, new PropertyChangedEventArgs("id0"));
    	}
    	}
    }
    
    
    j'arrive à recuperer un id0.

    voila merci.

  4. #4
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Désolé pour le précédent message qui a été coupé.

    Je ne comprends pas vraiment le rapport entre les deux extraits de code.
    Tu souhaites binder quelle propriété avec la textbox ?

    Bon courage,

    PS: Est-ce que n'est tout simplement pas le mode TwoWay du Binding qui manque dans ton premier extrait de code ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Par défaut
    voila ce que je veux.
    creation dynamique des controls en se basant sur une table de données.
    exemple:

    table sports
    id name
    1 Foot
    2 Golf
    3 Tennis

    je veux creer autant de ligne que controls

    textboxid1 textboxname1
    textboxid2 textboxname2
    textboxid3 textboxname3

    plus un boutton Enregistrer.

    lorsque je clique sur Enregistrer je veux recuperer les valeurs des controls ds
    viewmodel. ensuite l'enregister dans la base.

    Myview======> cliquer sur enregister ========>myviewModel=====>save()====>enregister le contenu dans une list =============> ensuite si c'est possible update la base.

    voila ce que je veux.

    ce que j'ai fait:

    j'ai essayé le binding manuel en creant un control textbox
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{Binding Path=MyDataProperty, Mode=TwoWay}"
    . j'arrive à recuperer la valeur intouduise dans la methode save.

    je veux avoir la meme resultat d'une maniere dynamique

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    N'oublie pas de mettre en mode TwoWay comme te l'a indiqué jmix90.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Binding test = new Binding() { Path = new Uri("blabla"), Mode = BindingMode.TwoWay };
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Par défaut
    merci pour la syntaxe.
    sauf que j'ai besoin de recuperer des objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Binding test = new Binding() { Path = new Uri("mylistsport[i].id"), Mode = BindingMode.TwoWay};
    je rexplique mon probleme:

    j'ai une table sports:
    id name
    1 Foot
    2 Golf
    3 Tennis

    et je veux modifier le contenu de cette table d'une maniere dynamique tout en respectant l'architecture MVVM.

    c'est à dire une View viewModel Model

    MyView: je veux creer autant de controls textbox que les noms.
    ça donne labelid1 name1
    labelid2 name2
    label3 name3
    est surtout je veux recuperer le contenu de ma table dans l'evenement LOAD.
    ensuite il y a un bouton enregister pour valider l'enregistrement.(faiyt appel au save de ma VIewModel)

    VM: apres le click sur save : je serai capable de recuperer l'ensemble des données

    Model : class sport{ int id, string name}


    *********************************************************


    le probleme:

    je veux pas creer des propriéte manuelement: je m'explique
    dans mon VM: je veux pas avoir :
    int id0
    string name0
    intid1
    string name1
    ....
    ....
    autant de id que le nombre de ligne dans la table sports
    du coup je cherche à ajouter une liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ilist <sport> mylist=new list<sport>;
    je pense que ça m'evite le probleme des propriete cree à la main à chaque fois que j'au des ligne de plus dans ma table.

    sauf que je sais pas comme faire le binding sur une propriete d'un objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<sport> mylist=this.DataContext// je sais pas si c'est possible de faire ça
    DependencyProperty textProp = TextBox.TextProperty;
    Binding b = new Binding(mylist[index].id);?????????
    b.Mode = BindingMode.TwoWay;
    BindingOperations.SetBinding(textblockid, textProp, b);
    j'espere que j'etais clair
    voila des idées???

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    Utilise un ItemsControl et set lui sa source avec ta liste à binder.
    tu pourras alors avoir un datatemplate avec tes texboxs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
                    <DataTemplate>
    <Grid><TextBox Text="Binding..."/></Grid>
                    </DataTemplate>
    </ItemsControl.ItemTemplate>
    </ItemsControl>

Discussions similaires

  1. Bind dynamique sur hashset
    Par bertrand0756 dans le forum Spring
    Réponses: 5
    Dernier message: 31/08/2011, 13h33
  2. Binding dynamique non fonctionnel
    Par koyot3 dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 14/06/2011, 09h53
  3. [.NET4.0] binding dynamique list d'image
    Par aram2 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 07/07/2010, 13h54
  4. Réponses: 12
    Dernier message: 22/04/2009, 11h17
  5. [Gridview] Colonnes et binding dynamique
    Par anthyme dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 25/06/2008, 11h47

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