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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top