Это немного хитрый;решение включает в себя сборку с полной .NET Framework (поскольку клиентская среда не включает System.Design
).Вам нужно создать свой собственный подкласс CollectionEditor
и сообщить ему, что делать с временной коллекцией после того, как пользовательский интерфейс завершит работу с ней:
public class SomeTypeEditor : CollectionEditor {
public SomeTypeEditor(Type type) : base(type) { }
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
object result = base.EditValue(context, provider, value);
// assign the temporary collection from the UI to the property
((ClassContainingStuffProperty)context.Instance).Stuff = (List<SomeType>)result;
return result;
}
}
Затем вы должны украсить свою собственность с помощью EditorAttribute
:
[Editor(typeof(SomeTypeEditor), typeof(UITypeEditor))]
public List<SomeType> Stuff {
// ...
}
Длинный и запутанный, да, но это работает.После того, как вы нажмете «ОК» во всплывающем окне редактора коллекции, вы сможете снова открыть его, и значения останутся.
Примечание. Необходимо импортировать пространства имен System.ComponentModel
, System.ComponentModel.Design
и System.Drawing.Design
.