Die Bindung Dynamic an ein Datagrid mit automatischer Spalte Generation?
-
20-09-2019 - |
Frage
Ich experimentiere noch mit DynamicObjects. Jetzt brauche ich einige Informationen: Ich versuche, ein Objekt zu binden, von Dynamic zu einer WPF-Datagrid erbt (nicht Silverlight).
Wie kann ich das Datagrid erhalten, um automatisch die Spalten aus den verfügbaren öffentlichen Eigenschaften des Objekts zu erstellen, die typischerweise zur Laufzeit generiert werden? Ist das möglich eigentlich?
Lösung
Es gibt keine einheitliche Art und Weise, um die Abfrage dynamische Eigenschaften, es wird allgemein erwartet, dass man sie im Voraus wissen. Mit DynamicObject
, Implementierer GetMemberNames
außer Kraft setzen kann und das gibt Sie in der Regel die Eigenschaften, aber ist es wirklich bedeutete für die Fehlersuche, weil es nicht erforderlich ist, dass es alle Eigenschaften bieten. Andernfalls wäre es Ihr eigenes DynamicObject
ist müssen Sie nur noch Ihre eigene Methode schreiben, um die Eigenschaften auf Ihre dynamische Implementierung basiert zu erhalten. Zum Beispiel ExpandoObject
können Sie alle Eigenschaften mit Hilfe des IDictionary
Schnittstelle abgefragt werden.
Also, wenn Sie eine Möglichkeit haben, Ihre Eigenschaften zu erhalten, müssen Sie die Datagrid erzählen. Leider mit einem Datagrid, ist das Problem ICustomTypeDescriptor
mit der Umsetzung dem Datagrid über Ihre Eigenschaften zu sagen, dass Datagrid den TypeDescriptors mit der Art nicht die Instanz bekommt, was ein Problem ist für dynamische Objekte jedoch ITypedList
über die Sammlung von DynamicObjects Umsetzung mit der funktioniert sehr kleiner gotcha von, wenn Sie den nicht-generischen IList
Schnittstelle auf Ihrer Sammlung nicht umsetzen können, wird sie ausgezogen, bevor es auf den Punkt, wo es prüft, ob ITypeList
.
Also zusammenfassend, Implementieren Sie eine Sammlung mit ITypedList
und IList
. Mit ITypedList
return null für GetListName
und nur GetItemProperties(PropertyDescriptor[] listAccessors)
umzusetzen; Ignorieren listAccessors
und gibt einen PropertyDescriptorCollection von propertyDescriptors für jedes benannte Mitglied auf der Grundlage der besten repräsentierte dynamische Objektinstanz in der Liste (höchstwahrscheinlich nur das erste Objekt). Sie haben eine Unterklasse von PropertyDescriptor, eine einfache und allgemein auf die Get / Set-Wert zu implementieren, ist die Open-Source-Framework 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);
}
}
}
Andere Tipps
Ich denke, die DataGrid
Anwendungen TypeDescriptor
die Objekteigenschaften erhalten Sie die Spalten zu erstellen. So sollten Sie in der Lage sein, dies zu erreichen, wenn Sie Ihre DynamicObject
Geräte ICustomTypeDescriptor
. Implementieren Sie die GetProperties
Methode, so dass es die dynamischen Eigenschaften des Objekts zurück.