我使用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 { }
我希望我能清楚地解释我的问题,有人可以提供帮助。谢谢。
答案 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);
}
}