У меня есть бизнес-объект, который можно редактировать с помощью PropertyGrid. Он содержит список меток (скажем, строки для упрощения).
public class MyObject
{
// bunch of properties here, cut for readiness
public LabelsList List {get;set;}
// ...
}
Список меток - простой класс, унаследованный от List:
public class LabelsList : List<T>
{}
Для правильного отображения моего объекта в сетке свойств (под этим я подразумеваю также расширяемый редактируемый список меток) я реализовал ICustomTypeDescriptor для LabelsList, в частности изменив метод GetProperties ():
public PropertyDescriptorCollection GetProperties()
{
var props = new PropertyDescriptorCollection(null);
for (var i = 0; i < this.Count; i++)
{
var descriptor = new LabelsListPropertyDescriptor(this, i);
props.Add(descriptor);
}
return props;
}
Теперь проблема - когда я использую стандартную сериализацию XAML, вызывая XamlWriter.Save (this) для базового типа, он добавляет чрезмерный тег LabelsList.LabelName внутри получающегося XAML:
<wpfdl:LabelsList>
*<wpfdl:LabelsList.Label1Name>*
<wpfdl:Label LabelText="Label1Name"/>
*</wpfdl:LabelsList.Label1Name>*
...
</wpfdl:LabelsList>
Это фактически отключает следующий (MyObject) вызов XamlReader.Parse (exportedXaml), поскольку имена меток могут содержать специальные символы. Какой правильный обходной путь для достижения правильного редактирования и сериализации объектов? Заранее спасибо.
обновление
Удалите ненужные теги, изменив соответствующий PropertyDescriptor:
public override bool ShouldSerializeValue(object component)
{
return false;
}
Результирующий xaml выглядит следующим образом (Примитив - это имя пользовательского типа моего объекта):
<Primitive>
<Primitive.Labels>
<Label LabelText="text1" LabelPosition="position1" />
<Label LabelText="text2" LabelPosition="position2" />
</Primitive.Labels>
</Primitive>
Вот и все, но теперь тегов внутри отсутствуют:
'Collection property 'WPF_DrawingsTest.Primitive'.'Labels' is null.' Line number '1' and line position '96'.
Еще нужно сделать эту работу. Возможно, тестовый проект поможет увидеть, что я ищу:
Тестовый проект, 100 Кб, вирусов нет