ICustomTypeDescriptor и сериализация XAML - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть бизнес-объект, который можно редактировать с помощью 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 Кб, вирусов нет

1 Ответ

0 голосов
/ 16 декабря 2011

Рефакторинг исходного бизнес-объекта, сериализация / десериализация теперь выполняется автоматически и работает нормально.

...