2013-06-26 3 views
1

J'ai une classe Entry, à travers lequel je veux exposer des données à un Gridview dans WPF (via un List<Entry>). Je dois avoir une colonne dans le Gridview pour chaque propriété de l'objet Entry (aussi obtenir une colonne pour chaque entrée de propsA3), mais je ne suis pas sûr de savoir comment définir les méthodes getter/setter pour le tableau afin de toujours obtenir/définir les propriétés des données sous-jacentes.Get/Set méthode pour les propriétés de tableau

public Entry 
{ 
    private ObjA oA; 
    private ObjB[] listB; 

    public int PropA1 {get {return oA.Prop1;} set {oA.Prop1 = value;}} 
    public int PropA2 {get {return oA.Prop2;} set {oA.Prop1 = value;}} 
    public int[] propsA3; 
} 

public ObjA 
{ 
    public int Prop1 {get, set}; 
    public int Prop2 {get, set}; 

    public int getVal3(ObjB b) {return calSomethin(b);} 
    public int setVal3(ref ObjB b, int val) { /*do something to ObjB*/} 
} 

public ObjB 
{ 
    Byte[] data; 
} 

Ce que je veux pour PropsA3 ont une présentation/comportement ensemble de ce qui suit:

Entry e; 

Get: int a = e.propsA3[i]; =>a = oA.getVal3(listB[i]);

Ensemble: e.propsA3[i] = 5; =>oA.setVal3(listB[i], val);

Est-ce possible? Comment atteindre cet objectif ou comment dois-je changer la conception de la classe pour obtenir le résultat souhaité?

Répondre

1

Il est possible, mais je ne suis pas sûr de ce que l'avantage serait, vous pouvez le faire en utilisant une classe wrapper .. par exemple:

public class Entry 
{ 
    private ObjA oA; 
    private ObjB[] listB; 

    public int PropA1 {get {return {oA.Prop1}} set {oA.Prop1 = value;}} 
    public int PropA2 {get {return {oA.Prop2}} set {oA.Prop1 = value;}} 
    public EntryProperties propsA3; 

    public Entry() 
    { 
     propsA3 = new EntryProperties(this); 
    } 

    public class EntryProperties 
    { 
     private Entry _entry; 

     public EntryProperties(Entry entry) { 
      _entry = entry; 
     } 

     public int this[int index] { 
      get { return _entry.oA.getVal3(_entry.listB[index]); } 
      set { _entry.oA.setVal3(_entry.listB[index], value); } 
     } 
    } 
} 

Cela dit, je ne pense pas vraiment que c'est une bonne idée - pourquoi ne pas définir une classe de modèle de vue avec les propriétés que vous voulez dans la grille et ensuite paramétrer les manuellement, ou utiliser quelque chose comme AutoMapper ou ValueInjector de le faire ...

+0

Remerciements s pour la réponse. Je ne suis pas en train de devoir accéder à 'e.propsA3 [i]' mais je pensais que mon modèle de vue aurait un 'List kiki

+0

Si vous savez ce que les propriétés seront, alors je suggère de les ajouter tous explicitement, ou si ce n'est pas vraiment ce que vous voulez, peut-être regarder à l'aide d'un DataTable ou autre équivalent du dictionnaire –

1

Cela devrait fonctionner

pulbic Entry 
{ 
    public ObjA propsA3 { get; set; } 
} 

public ObjA 
{ 
    public int Prop1 {get, set}; 
    public int Prop2 {get, set}; 

    public int this[ObjB b] 
    { 
     get { return getVal(b); } 
     set { /* do something*/ } 
    } 

    private int getVal3(ObjB b) {return calSomethin(b);} 
    private int setVal3(ref ObjB b, int val) { /*do something to ObjB*/} 
} 
Questions connexes