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)并添加 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 { }
我希望我能清楚地解释我的问题并且有人可以提供帮助。谢谢。
奇怪……看来,这并没有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);
}
}
我使用 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)并添加 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 { }
我希望我能清楚地解释我的问题并且有人可以提供帮助。谢谢。
奇怪……看来,这并没有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);
}
}