2010-03-18 12 views
8

Ich experimentiere immer noch mit DynamicObjects. Jetzt brauche ich ein paar Informationen: Ich versuche ein Objekt zu binden, das von DynamicObject zu einem WPF DataGrid (nicht Silverlight) erbt.DynamicObject an ein DataGrid mit automatischer Spaltengenerierung binden?

Wie bekomme ich das Datagrid automatisch seine Spalten aus den verfügbaren öffentlichen Eigenschaften des Objekts erstellen, die zur Laufzeit typischerweise erzeugt werden? Ist das eigentlich möglich?

Antwort

10

Es gibt keine einheitliche Möglichkeit, dynamische Eigenschaften abzufragen, im Allgemeinen wird erwartet, dass Sie diese im Voraus kennen. Mit DynamicObject können Implementierer GetMemberNames überschreiben und das gibt Ihnen im Allgemeinen die Eigenschaften, jedoch ist es wirklich für das Debuggen bestimmt, da es keine Anforderung gibt, dass es alle Eigenschaften bereitstellt. Ansonsten, wenn es Ihre eigene DynamicObject ist, müssen Sie nur Ihre eigene Methode schreiben, um die Eigenschaften basierend auf Ihrer dynamischen Implementierung zu erhalten. Mit ExpandoObject können Sie beispielsweise alle Eigenschaften mit der Schnittstelle IDictionary abfragen.

Sobald Sie also eine Möglichkeit haben, Ihre Eigenschaften zu erhalten, müssen Sie das DataGrid informieren. Leider mit einem Datagrid, das Problem mit ICustomTypeDescriptor Durchführung dem Datagrid über Ihre Eigenschaften zu sagen ist, dass Datagrid den TypeDescriptors mit der Art nicht die Instanz bekommt, was ein Problem für dynamische Objekte ist jedoch ITypedList über die Sammlung von DynamicObjects Umsetzung mit der funktioniert Wenn Sie das nicht-generische Interface IList in Ihrer Sammlung nicht implementieren, wird es entfernt, bevor es an den Punkt gelangt, wo es nach ITypeList sucht.

Also zusammenfassend, implementieren Sie eine Sammlung mit ITypedList und IList. Mit ITypedList geben Sie null für GetListName zurück und implementieren Sie einfach GetItemProperties(PropertyDescriptor[] listAccessors); Ignoriere listAccessors und gebe eine PropertyDescriptorCollection von PropertyDescriptors für jedes Element zurück, das auf der Grundlage der am besten dargestellten dynamischen Objektinstanz in der Liste benannt wurde (höchstwahrscheinlich nur das erste Objekt). Sie haben eine Unterklasse von PropertyDescriptor, ein einfacher und allgemeiner Weg zum Get/Set-Wert zu implementieren, ist den Open-Source-Framework verwendet Dynamitey

using System; 
using System.ComponentModel; 
using Dynamitey; 
public class DynamicPropertyDescriptor:PropertyDescriptor 
{ 
     public DynamicPropertyDescriptor(string name) : base(name, null) 
     { 
     } 

     public override bool CanResetValue(object component) 
     { 
      return false; 
     } 

     public override object GetValue(object component) 
     { 
      return Dynamic.InvokeGet(component, Name); 
     } 

     public override void ResetValue(object component) 
     { 

     } 

     public override void SetValue(object component, object value) 
     { 
      Dynamic.InvokeSet(component, Name, value); 
     } 

     public override bool ShouldSerializeValue(object component) 
     { 
      return false; 
     } 

     public override Type ComponentType 
     { 
      get { return typeof(object); } 
     } 

     public override bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public override Type PropertyType 
     { 
      get 
      { 
       return typeof (object); 
      } 
     } 
} 
+0

das funktioniert auch in winforms. Vielen Dank! – swe

2

Ich denke, die DataGridTypeDescriptor verwendet die Objekteigenschaften erhalten Sie die Spalten zu erstellen. Sie sollten dies also erreichen können, wenn Ihr DynamicObjectICustomTypeDescriptor implementiert. Implementieren Sie die GetProperties-Methode, damit die dynamischen Eigenschaften Ihres Objekts zurückgegeben werden.

+0

Dies ist die Art und Weise mit Silverlight in jedem Fall zu gehen, als SL ‚doesn t habe 'ITypedList'. – McGarnagle

Verwandte Themen