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

时间:2016-04-22 07:49:42

标签: c# wpf collections wpftoolkit propertygrid

我使用WPF Toolkit CE的属性网格。 在将对象添加到集合时,打开的对话框显示组合框以选择要添加的新类型。在我为NewItemTypesAttribute阅读的文档中: 此属性可以修饰所选对象的集合属性(即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
  {
  }
}

在这种情况下,“选择类型”列表为空。

我尝试使用List<object>代替ArrayList,但该列表仅包含Object类型。

最初,我想要一个List<MyBaseObj>(将是一个抽象类),并添加MyObj1 resp 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  { }

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

1 个答案:

答案 0 :(得分:1)

奇怪......似乎,这不是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);
  }
}