Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

éléments de collection et interface homme machine

1 réponse
Avatar
cyrille
Bon,
j'ais le cerveau qui fume, et je viens donc vous exposer ma r=E9flexion.

Sur une partie de l'IHM j'affiche la liste des =E9l=E9ments d'une collect=
ion
et sur une autre partie les d=E9tails de l'=E9l=E9ment s=E9lectionn=E9 da=
ns la pr=E9c=E9dente liste afin d'en proposer l'=E9dtion.

Quand je modifie une propri=E9t=E9 d'un =E9l=E9ment, je m'adresse directe=
ment =E0 lui (element.Name=3D"toto").

Je souhaiterais bien s=FBr que ce gentil =E9l=E9ment propage le fait qu'i=
l a subit une modification,
mais son seul point commun avec le monde ext=E9rieure est son conteneur, =
"la collection".
Ca veut dire qu'il faut que chaque =E9l=E9ment poss=E8de une r=E9f=E9renc=
e sur son conteneur afin de l'informer qu'il a =E9t=E9=20
modifi=E9 (c'est pas forc=E9ment super).

suite du probl=E8me, le conteneur est pr=E9venu qu'un de ses =E9l=E9ments=
a =E9t=E9 modifi=E9, mais lequel ?
peut =EAtre l'=E9l=E9ment aura d=FB lui fournir son adresse propre (GetHa=
shCode() ?)

et pour finir, le conteneur fait suivre l'information aux =E9l=E9ments de=
l'IHM afin qu'ils proc=E8dent =E0 leur rafra=EEchissement.

Cel=E0 vous parrait il standard ou bien trop lourdingue ?
quel sont les solutions possibles pour r=E9pondre =E0 cette architecture =
???

merci
cyrille

1 réponse

Avatar
toto
je ne comprends pas tout le détail mais il me semble que la solution
pourrait passer par la création d'un événement (event) pour lequel tu
créerais une classe dérivant de EventArgs et qui te servirait à communiquer
les paramètres de ton choix.
ensuite, tu abonnes à cet événement toutes les classes qui doivent être
notifiées du déclenchement de cet événement, c'est le principe du design
pattern Observateur

voici par exemple ce que je fais dans une classe de parcours récursif de
fichiers :
public class ExploreDirectory
{
...
public delegate void FileFoundEventHandler(object sender,
FileFoundEventArgs fe); // le delegate, noter l'argument FileFoundEventArgs
public event FileFoundEventHandler FileFound; // l'événement du type
delegate précédent
protected virtual void OnFileFound(FileInfo filename) // à chaque fichier
trouvé
{
FileFoundEventArgs fe = new FileFoundEventArgs(filename); // création
d'un argument de ma classe perso
if (FileFound != null)
FileFound(this, fe); // déclenchement de l'événement
}
...
}

// la classe d'arguments perso
public class FileFoundEventArgs: EventArgs
{
private FileInfo _filenameinfo;
public FileInfo FileNameInfo
{
get{return this._filenameinfo;}
}

public FileFoundEventArgs(FileInfo file)
{
this._filenameinfo = file;
}
}

et maintenant, du côté de la classe abonnée :
// création d'un objet ExploreDirectory
ExploreDirectory ed = new ExploreDirectory(di, this.Extension,
this.Recurse);
ed.FileFound +=new
CW_ConsistencyCheck.ExploreDirectory.FileFoundEventHandler(ed_FileFound); //
abonnement à l'événement
ed.FindFile(); // lancement de la routine de recherche de fichiers qui va
déclencher l'événement si fichier trouvé
// ici c'est la classe abonnée qui lance la routine qui elle même
déclenchera l'événement mais dqns ton code ça peut être autre chose

//dans cette même classe, la méthode de gestion de l'événement (= un
delegate)
private void ed_FileFound(object sender, FileFoundEventArgs fe)
{
// mettre le code qui exploite l'argument FileFoundEventArgs fe
}

les delegate sont comme des pointeurs sur fonctions, tu peux ajouter autant
de méthodes que tu le veux avec l'opérateur surchargé +
"cyrille" wrote in message
news:
Bon,
j'ais le cerveau qui fume, et je viens donc vous exposer ma réflexion.

Sur une partie de l'IHM j'affiche la liste des éléments d'une collection
et sur une autre partie les détails de l'élément sélectionné dans la
précédente liste afin d'en proposer l'édtion.

Quand je modifie une propriété d'un élément, je m'adresse directement à lui
(element.Name="toto").

Je souhaiterais bien sûr que ce gentil élément propage le fait qu'il a subit
une modification,
mais son seul point commun avec le monde extérieure est son conteneur, "la
collection".
Ca veut dire qu'il faut que chaque élément possède une référence sur son
conteneur afin de l'informer qu'il a été
modifié (c'est pas forcément super).

suite du problème, le conteneur est prévenu qu'un de ses éléments a été
modifié, mais lequel ?
peut être l'élément aura dû lui fournir son adresse propre (GetHashCode() ?)

et pour finir, le conteneur fait suivre l'information aux éléments de l'IHM
afin qu'ils procèdent à leur rafraîchissement.

Celà vous parrait il standard ou bien trop lourdingue ?
quel sont les solutions possibles pour répondre à cette architecture ???

merci
cyrille