提交 c410acbb 编写于 作者: A Atsushi Eno

Fixed bug #666872; XElement.Changed and .Changing were not triggered.

Patch almost by Cambell Prince.
上级 696c528a
......@@ -71,10 +71,16 @@ namespace System.Xml.Linq
return;
foreach (object o in XUtil.ExpandArray (content))
{
if (!OnAddingObject (o, false, last, false))
{
OnAddingObject ();
AddNode (XUtil.ToNode (o));
OnAddedObject ();
}
}
}
void AddNode (XNode n)
{
CheckChildType (n, false);
......@@ -121,7 +127,7 @@ namespace System.Xml.Linq
{
return false;
}
public XmlWriter CreateWriter ()
{
return new XNodeWriter (this);
......
......@@ -162,5 +162,21 @@ namespace System.Xml.Linq
if ((options & LoadOptions.SetBaseUri) != LoadOptions.None)
BaseUri = r.BaseURI;
}
internal virtual void OnAddingObject ()
{
if (Parent != null)
Parent.OnAddingObject ();
if (Changing != null)
Changing.Invoke (this, null);
}
internal virtual void OnAddedObject ()
{
if (Parent != null)
Parent.OnAddedObject ();
if (Changed != null)
Changed.Invoke (this, null);
}
}
}
......@@ -1601,5 +1601,60 @@ namespace MonoTests.System.Xml.Linq
</rt>";
Assert.AreEqual (xml, root.ToString ().Replace ("\r\n", "\n"), "#1");
}
private class EventHandler
{
public bool ChangingInvoked { get; private set; }
public bool HasChanged { get; private set; }
public void OnChanging (object node, XObjectChangeEventArgs args)
{
ChangingInvoked = true;
}
public void OnChanged (object node, XObjectChangeEventArgs args)
{
HasChanged = true;
}
}
[Test]
public void Add_ToRootNode_ChangeTriggers ()
{
var inputXml = "<root><a><b /></a></root>";
var reader = XmlReader.Create (new StringReader (inputXml), new XmlReaderSettings ());
XDocument doc = XDocument.Load (reader);
var eventHandler = new EventHandler ();
doc.Root.Changing += eventHandler.OnChanging;
doc.Root.Changed += eventHandler.OnChanged;
var newElement = XElement.Parse ("<c/>");
doc.Root.Add (newElement);
Assert.IsTrue (eventHandler.ChangingInvoked, "OnChanging not triggered");
Assert.IsTrue (eventHandler.HasChanged, "OnChanged not triggered");
}
[Test]
public void Add_ToChildNode_ChangeTriggersOnRoot ()
{
var inputXml = "<root><a><b /></a></root>";
var reader = XmlReader.Create (new StringReader (inputXml), new XmlReaderSettings ());
XDocument doc = XDocument.Load (reader);
var eventHandler = new EventHandler ();
var newElement = XElement.Parse ("<c/>");
doc.Root.Add (newElement);
doc.Root.Changing += eventHandler.OnChanging;
doc.Root.Changed += eventHandler.OnChanged;
var nextNewElement = XElement.Parse ("<d/>");
newElement.Add (nextNewElement);
Assert.IsTrue (eventHandler.ChangingInvoked, "OnChanging not triggered");
Assert.IsTrue (eventHandler.HasChanged, "OnChanged not triggered");
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册