Ich implementiere INotifyPropertyChanged in meiner ModelBase-Klasse, so dass alle meine abgeleiteten Klassen Zugriff auf die INotifyPropertyChanged-Methoden und -Ereignisse haben.Caliburn.Micro IsNotifying-Eigenschaft nicht serialisieren
Ich verwende Caliburn.Micro in meinem Projekt, also habe ich dies getan, indem ich INotifyPropertyChangedEx in meiner IModelBase-Schnittstelle implementiert und dann PropertyChangedBase in meiner ModelBase-Klasse erweitert habe.
Das alles funktioniert gut, außer dass die IsNotifying-Eigenschaft von PropertyChangedBase mit meinen Modellen serialisiert wird. Ich habe ein paar Dinge ausprobiert, aber ich war nicht in der Lage, die Serialisierung zu stoppen.
Ich habe versucht, IsNotifying in ModelBase und hinzugefügt [XmlIgnore] zu der Eigenschaft. Ich habe auch versucht, IsNotify zu verbergen, indem ich das neue Schlüsselwort in meiner ModelBase-Klasse verwende. Keines von beiden hat funktioniert.
Ich habe den PropertyChangedBase-Code von github kopiert, in meine eigene PropertyChangedBase-Klasse eingefügt und dann [XmlIgnore] zur IsNotifying-Eigenschaft hinzugefügt. Das hat funktioniert, ist aber nicht ideal.
Irgendwelche Ideen? Kann das gemacht werden? Sollte ich nur mit der Caliburn.Micro PropertyChangedBase verschrotten und meine eigene implementieren? Es ist nicht schwierig, INotifyPropertyChanged zu implementieren. Ich habe gerade versucht, das in Caliburn.Micro zu verwenden, da ich bereits die Bibliothek benutze.
Dies ist ein einfaches Beispiel, das die XML an die Konsole
using System;
using System.IO;
using System.Xml.Serialization;
using Caliburn.Micro;
namespace CaliburnPropertyChangedBase
{
internal class Program
{
private static void Main()
{
var myModel = new MyModel {SomeProperty = "Test"};
Console.WriteLine(myModel.SerializeObject());
Console.ReadKey();
}
}
public static class XmlHelper
{
public static string SerializeObject<T>(this T toSerialize)
{
var xmlSerializer = new XmlSerializer(toSerialize.GetType());
using (var textWriter = new StringWriter())
{
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
}
}
public interface IModelBase : INotifyPropertyChangedEx
{
}
public class ModelBase : PropertyChangedBase, IModelBase
{
}
public interface IMyModel : IModelBase
{
string SomeProperty { get; set; }
}
public class MyModel : ModelBase, IMyModel
{
public string SomeProperty { get; set; }
}
}
Dies ist die Ausgabe
<?xml version="1.0" encoding="utf-16"?>
<MyModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IsNotifying>true</IsNotifying>
<SomeProperty>Test</SomeProperty>
</MyModel>
Als Hinweis, die Tatsache, dass es die Serialisierung, dass das Eigentum nicht ein Zug zerschlagen ist. Es verursacht keine Probleme mit meiner Anwendung. Es ist einfach nicht richtig, es dort zu haben. Wenn jemand anderes unser XML konsumieren würde, müssten wir ihm sagen, dass er diese Eigenschaft ignorieren soll. – Marc