WPF 工具包社区版 属性 网格:集合编辑器中的新项目类型

WPF Toolkit Community Edition Property Grid: New Item Types in Collection Editor

我使用 WPF Toolkit CE 的 属性 网格。 将对象添加到集合时,打开的对话框会显示一个组合框 select 要添加的新类型。在我为 NewItemTypesAttribute 阅读的文档中: 此属性可以修饰 selected 对象的集合属性(即 IList),以控制允许在 CollectionControl 中实例化的类型。

但我无法让它工作。 这是我尝试的最后一个变体:

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
  {
  }
}

在这种情况下,"select type" 列表是空的。

我尝试使用 List<object> 而不是 ArrayList 但列表只包含对象类型。

最初我想要一个 List<MyBaseObj>(将是一个抽象 class)并添加 MyObj1resp MyObj2 类型的对象,它们都继承自 MyBaseObj.与文档示例中的相同:

  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
      Community myObj = new Community();
      myObj.Members = new List<Person>();
      this.PGrid.SelectedObject = myObj;
    }
  }

  public class Community
  {
    [NewItemTypes(typeof(Man), typeof(Woman))]
    [Editor(typeof(CollectionEditor), typeof(CollectionEditor))]
    public IList<Person> Members { get; set; }
  }

  public class Person { }
  public class Man : Person  { }
  public class Woman : Person  { }

我希望我能清楚地解释我的问题并且有人可以提供帮助。谢谢。

奇怪……看来,这并没有100%实现。 现在我制作了自己的 CollectionEditor 并自己设置了这个属性的类型。

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);
  }
}