1

ビューモデルを常に変化する XDocument と同期させる簡単な方法を知っている人はいますか? XDocument は Microsoft.VisualStudio.XmlEditor.XmlModel クラス ( http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.xmleditor.xmlmodel.aspx ) から取得されます。ユーザーが Visual Studio エディターでテキストを変更すると、同じ XDocument が常に更新されます。

XML全体をオブジェクトに毎回解析するためにシリアライゼーションを使用したくありません。ドキュメントは非常に大きく、これはパフォーマンスの大きなボトルネックになります。

この質問は私の質問と似ていますが、「(ヘルパー)」には何を記入すればよいですか?XDocument 上の ViewModel

要件: - XDocument ツリー内の何かが変更されたときにビューモデルを更新する必要があり、最小限の変更を適用する必要があります。- オブジェクトの子が変更されたときのイベント。- 複数の同じ子タグがある場合の Observablecollections - オブジェクトは再利用する必要があり、カスタム クラスから作成されたオブジェクトにアクセスするたびに新しい要素は作成されません。そのため、プロパティを使用して、xml から生成されたオブジェクトを保持する必要があります。オブジェクトは、新しい子で更新する必要があります。

このタスクを簡単に行うためのフレームワークまたは何か利用できるものはありますか? 多くの人がすでにこのようなことをしていると思いますが、車輪の再発明はしたくありません.

この質問が少し明確になることを願っています。

4

1 に答える 1

0

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 があなたのものになります。

次の場所で良い例を見つけました。

于 2013-01-23T23:07:21.177 に答える