Сериализация Xaml и неизменяемые структуры?
-
22-07-2019 - |
Вопрос
Как я могу это сделать?
Пробовал использовать TypeConverter, но единственное, что мне пришло в голову, это создать XML для типов, что не совсем подходит.Преобразователи типов при сериализации xaml экранируют xml и обрабатывают его как обычный текст.Преобразователи значений не намного лучше.
Теперь я перехожу к ISupportInitialize и выдам, если изменения будут внесены после инициализации, но мне бы понравился неизменяемый маршрут...
Пример типа, который я хочу сериализовать:
public struct Foo
{
public string Bar {get;private set;}
public Foo(string bar) : this()
{
Bar = bar;
}
}
и код
var foo = new Foo("lol");
var serializedFoo = XamlWriter.Save(foo);
Решение
К сожалению, вы не можете использовать обычную сериализацию с неизменяемыми объектами в XAML 2006.
С XAML 2009, который поддерживает конструкторы и фабричные методы, вы сможете достичь своей цели. Только предупреждаем, WPF 4 не будет использовать XAML 2009.
Другие советы
Дох!Я совершенно неправильно истолковал этот вопрос...
=================================
Попробуйте использовать расширение разметки для создания вашей неизменяемой структуры:
public class FooExtension : MarkupExtension
{
public string Bar {get; set;}
public ImgPathExtension(string bar)
{
this.Bar = bar;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var foo = new Foo(this.Bar);
return foo;
}
}
Теперь вы можете использовать его в своем XAML с синтаксисом расширения:{ext:Foo Bar="lol"}
Просто используйте его так же, как вы использовали бы любой другой MarkupExtension, такой как Binding, DynamicResource и т.д.
Видишь эта ссылка если вам нужна более подробная информация.
HTH,
Чарльз