Как убедить System.Xaml.XamlXmlWriter.WriteValue срабатывать, если значение равно NULL - PullRequest
1 голос
/ 18 декабря 2010

Я использую XamlServices.Transform, чтобы взять объектную модель и сериализовать ее в Xaml.

Я реализовал класс, который наследуется от XamlXmlWriter, который переопределяет WriteValue. Я использую это, чтобы восстановить пользовательский MarkupExtension обратно в визуализированный Xaml. Мой код работает нормально, за исключением случаев, когда значение свойства равно нулю, и в этом случае WriteValue не срабатывает, и у меня нет шанса «поменять» значение в переопределенном классе.

Связанная проблема заключается в том, что свойство имеет то же значение, которое указано в атрибуте System.ComponentModel.DefaultValue (). Например, скажем, у меня есть свойство в моей объектной модели, оформленное так:

[DefaultValue(true)]
public Boolean IsVisible {get; set;}

Тогда метод WriteValue срабатывает только в том случае, если свойство IsVisible имеет значение false (что имеет смысл).

Раздел примечаний в документации (http://msdn.microsoft.com/en-us/library/system.xaml.xamlxmlwriter.writevalue.aspx) упоминает что-то о нулевых значениях, но я этого не понимаю:

Входное значение может быть нулевым, что поддерживает явное выписывание нуля как сериализованное значение. Это поведение использует определение XamlLanguage.Null как ввод WriteStartObject, а затем немедленно вызывает WriteEndObject.

Как мне а) вызвать «WriteValue», если свойство имеет значение null, и б) вызвать «WriteValue», если свойство совпадает с атрибутом DefaultValue?

Я не уверен, связаны ли они, решение для любого из них было бы очень кстати.

Спасибо

Daniel

1 Ответ

2 голосов
/ 21 декабря 2010

Чтобы ответить сначала «b»: предполагаемое поведение XamlObjectReader - пропускать свойства, значение которых является объявленным «значением по умолчанию», и у нас нет возможности конфигурации, позволяющей переопределить это.Обратите внимание, что здесь «значением по умолчанию» является то, которое объявлено с атрибутом [DefaultValue ()], а не по умолчанию для языка C # (T), поэтому все может быть не так плохо, как вы опасаетесь.Я имею в виду, что не все «0» в свойстве «Int» пропускаются, потому что это «значение по умолчанию».

'a': потоком выходного узла XamlXmlWriter для нулевого значения не является «WriteValue (null)»», Но вместо этого« WriteStartObject (nullExtensions);WriteEndObject ()».Это поведение описанной вами документации.Так что с тобой все должно быть в порядке.Ищите StartObject «nullExtension» вместо значения «null».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...