XElement の周りに ViewModel を書くことができます。
例えば、
public class Model {
protected XElement Element {
get; set;
}
public Model() : this(null) { }
public Model(XElement element) {
// do some validation (XName)element.Name
this.Element = element ?? new XElement("Model");
}
public string Name {
get {
return (string)Element.Attribute("Name");
}
set {
// null: attribute is removed
Element.SetAttributeValue(value);
}
}
}
あなたのXml:
<Model Name="Marilyn" />
XDocument を使用すると、要素を読み取ることができます。
source.Select(xElement => new Model(xElement));
ObservableCollection 自体は、INotifyPropertyChanged パターンによって通知されます。
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
モデルでは、コンストラクターで割り当てる XObject.Change および .Changed イベントによって通知されます。
public Model() : this(null) {
// call public Model(XElement element = null)
}
public Model(XElement element) {
// do some validation (XName)element.Name
this.Element = element ?? new XElement("Model");
//this.Element.Changing += Element_Changing;
this.Element.Changed += Element_Changed;
}
XElement の変更を INotifyProperty の変更に接続できるようになりました。
protected void Element_Changed(object sender, XObjectChangeEventArgs ea) {
var attribute = sender as XAttribute;
if (attribute != null && attribute.Parent == this.Element) {
// only attributes of this element (and not the nested elements)
// the attribute name is assumed to be exactly same as property name 'Name'
OnPropertyChanged(attribute.Name);
}
}
XDocument.Root XElement または Model.Element XElement のみを監視する可能性があるため、Changed と Changing がバブルアップしていることに注意してください。
少し単純化しすぎていますが、それがどのように見えるかについてのアイデアを提供したいと考えています。これで、.NET Framework があなたのものになります。
次の場所で良い例を見つけました。