INotifypropertychanged utilisation ? [Résolu]

GillouXman 561 Messages postés mardi 4 mars 2008Date d'inscription 10 juin 2010 Dernière intervention - 11 mai 2009 à 22:51 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscriptionModérateurStatut 2 août 2014 Dernière intervention
- 17 mai 2009 à 14:56
Salut tout le monde, j'ai une petite question qui me turlupine.

Depuis WPF/Silverlight on parle bcp de binding et tout ca blablabla... et notamment de INotifypropertychanged qui permettraient de signaler à un composant que sa source a changé et de se mettre à jour (jusque là j'ai compris?)

ce que je ne comprends pas bien c'est que ce type de comportoment, on pouvait déja l'avoir sans avoir recours à INotifypropertychanged

voici un code qui explique mes dire

mon object Movie et une mini BLL qui est ma datasource
public class Movie
{
public string Title { get; set; }
public string Director { get; set; }
}
public class DataSource
{
public List<Movie> GetMovies()
{
List<Movie> movies = new List<Movie>();
movies.Add(new Movie { Director "ioioioo", Title "Matrix" });
movies.Add(new Movie { Director "Jean", Title "Matrix 2" });
return movies;
}
}

le code ma form

public partial class Form1 : Form
{
DataSource ds = new DataSource();
List<Movie> lmovies;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
lmovies = ds.GetMovies();
dataGridView1.DataSource = lmovies;
}

private void button1_Click(object sender, EventArgs e)
{
lmovies[0].Director = "MEEEEEEEEEEEEEe";
}
}
le simple fait de mettre Meeeeeeeeee dabs lmovies[0].Director, change ioioioo par MEeeeeee égalemenent dans l'interface. DOnc what's the point?

Qqc m'échappe ? ou c'est simplement un comportement lié au gridview dans ce cas ci ?

Merci d'avance
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention - 12 mai 2009 à 09:03
3
Merci
Salut,
Le GridView ne sera pas mis à jour!
Tu vois la modification si l'event paint est appelé, par exemple si tu passes le programme en dehors de l'écran, si une autre fenêtre passe par dessus, etc.
Prends l'exemple de MSDN: http://msdn.microsoft.com/fr-fr/library/system.componentmodel.inotifypropertychanged(VS.80).aspx

Presse sur le bouton => changement à l'écran.

Dans le code, remplace
public class DemoCustomer : INotifyPropertyChanged
par
public class DemoCustomer// : INotifyPropertyChanged

Presse sur le bouton => PAS de changement à l'écran.

Cette notion n'a rien avoir avec WPF (elle est apparue avec le framework 2.0 déjà) même si c'est vrai que WPF utilise ce concept abondamment...

<hr />
-Blog-
-Site Perso-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
GillouXman 561 Messages postés mardi 4 mars 2008Date d'inscription 10 juin 2010 Dernière intervention - 12 mai 2009 à 10:19
3
Merci
sorry pour le code

voici et avoir impléemté le INotifyPropertyChanged

BindingSource bs new BindingSource(); bs.DataSource lmovies;
dataGridView1.DataSource = bs;

Merci GillouXman 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de GillouXman
GillouXman 561 Messages postés mardi 4 mars 2008Date d'inscription 10 juin 2010 Dernière intervention - 12 mai 2009 à 09:50
0
Merci
non mais je sais que ça n'a rien avoir avec WPF, c'est juste revenu au devant de la piste ac les news technos que sont WPF et Silverlight.

par contre tu as raison que c'est seulement quand je clique sur le grid que c'est refresh.

donc selon toi, si j'implémente le INotifyPropertyChanged, ça devrait refresh sans devoir cliquer sur le grid par exemple) ? (donc sans devoir appeler le paint)
Commenter la réponse de GillouXman
GillouXman 561 Messages postés mardi 4 mars 2008Date d'inscription 10 juin 2010 Dernière intervention - 12 mai 2009 à 10:14
0
Merci
ok j'ai testé,

le truc en plus qu'apparement il faut faire avec le gridview, si tu veux que ça fonctionne tu dois utiliser un object BindingSource comme datasource
Commenter la réponse de GillouXman
GillouXman 561 Messages postés mardi 4 mars 2008Date d'inscription 10 juin 2010 Dernière intervention - 12 mai 2009 à 10:17
0
Merci
donc au final si on veut le propertychanged sur la propriété director

public class Movie:INotifyPropertyChanged
{
public string Title { get; set; }
private string _dir;
public string Director
{
get
{
return _dir;
}
set
{
_dir = value;
NotifyPropertyChanged("Director");
}
}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

#endregion
}

le bind du grid

lmovies = ds.GetMovies();


BindingSource bs = new BindingSource();
bs.DataSource = lmovies;

dataGridView1.DataSource = bs;
Commenter la réponse de GillouXman
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscriptionModérateurStatut 2 août 2014 Dernière intervention - 17 mai 2009 à 14:56
0
Merci
Salut,

De mémoire utiliser en DataSource une BindingList<T> ou lieu d'une List<T> permet aussi d'avoir le comportement correct sur le GridView, sans passer par BindingSource.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.