Вопрос

Как я могу это сделать?

Пробовал использовать 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,

Чарльз

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top