2016-04-22 17 views
0

Ich verwende das Eigenschaftsraster von WPF Toolkit CE. Beim Hinzufügen eines Objekts zu einer Sammlung zeigt das geöffnete Dialogfeld eine Auswahlliste, um den neuen Typ auszuwählen, der hinzugefügt werden soll. In der Dokumentation, die ich für NewItemTypesAttribute lesen: Dieses Attribut kann die Auflistungseigenschaften (d. H. IList) des ausgewählten Objekts dekorieren, um die Typen zu steuern, die im CollectionControl instanziiert werden können.WPF-Toolkit Community Edition-Eigenschaftsraster: Neue Elementtypen im Auflistungs-Editor

Aber ich kann es nicht funktionieren. Hier sind die letzte Variante habe ich versucht:

namespace TestPropertyGrid 
{ 
    /// <summary> 
    /// Interaktionslogik für MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MyObject myObj = new MyObject(); 
     this.PGrid.SelectedObject = new MyObject(); 
    } 
    } 

    public class MyObject 
    { 
    [NewItemTypes(typeof(MyBaseObj), typeof(MyObj1))] 
    [Editor(typeof(CollectionEditor), typeof(CollectionEditor))] 
    public ArrayList ListOfObjects { get; set; } = new ArrayList(); 
    } 

    public class MyBaseObj 
    { 
    } 

    public class MyObj1 
    { 
    } 
} 

In diesem Fall wird die „select type“ -Liste leer ist.

Ich versuche eine List<object> anstelle von ArrayList zu verwenden, aber die Liste enthält nur den Typ Objekt.

initialy wollte ich ein List<MyBaseObj> (würde eine abstrakte Klasse sein) und Objekte vom Typ MyObj1 bzw. MyObj2 hinzufügen, die beide von MyBaseObj erben würden. Das gleiche wie in der Dokumentation Beispiel:

Ich hoffe, ich könnte mein Problem klar erklären und jemand könnte helfen. Vielen Dank.

Antwort

0

Seltsam ... es scheint, das ist nicht zu 100% umgesetzt. Jetzt habe ich meinen eigenen CollectionEditor erstellt und die Typen aus diesem Attribut selbst gesetzt.

class MyCollectionEditor : TypeEditor<CollectionControlButton> 
{ 
    protected override void SetValueDependencyProperty() 
    { 
    ValueProperty = CollectionControlButton.ItemsSourceProperty; 
    } 

    protected override void ResolveValueBinding(PropertyItem propertyItem) 
    { 
    var type = propertyItem.PropertyType; 
    Editor.ItemsSourceType = type; 
    // added 
    AttributeCollection attrs = propertyItem.PropertyDescriptor.Attributes; 
    Boolean attrFound = false; 
    foreach(Attribute attr in attrs) 
    { 
     if (attr is NewItemTypesAttribute) 
     { 
     Editor.NewItemTypes = ((NewItemTypesAttribute)attr).Types; 
     attrFound = true; 
     break; 
     } 
    } 
    // end added 
    if (!attrFound) 
    { 
     if (type.BaseType == typeof(System.Array)) 
     { 
     Editor.NewItemTypes = new List<Type>() { type.GetElementType() }; 
     } 
     else if (type.GetGenericArguments().Count() > 0) 
     { 
     Editor.NewItemTypes = new List<Type>() { type.GetGenericArguments()[0] }; 
     } 
    } 
    base.ResolveValueBinding(propertyItem); 
    } 
}