XObject.Changed Event
Raised when this XObject or any of its descendants have changed.
Assembly: System.Xml.Linq (in System.Xml.Linq.dll)
Events are raised only when an XML tree is modified, not when it is constructed. This is because you have to add an event handler to an event before you can receive events, and you cannot add an event handler before you have a reference to an XObject. You cannot get a reference to an XObject before the XML tree is constructed. This means that during functional construction of an XML tree, you will not receive events.
You should be careful when modifying an XML tree within one of these events, because doing this might lead to unexpected results. For example, if you receive a Changing event, and while the event is being processed you remove the node from the tree, you might not receive the Changed event. When an event is being processed, it is valid to modify an XML tree other than the one that contains the node that is receiving the event; it is even valid to modify the same tree provided the modifications do not affect the specific nodes on which the event was raised. However, if you modify the area of the tree that contains the node receiving the event, the events that you receive and the impact to the tree are undefined.
The following example adds an event handler to the root element of an XML tree. It then modifies the tree, causing LINQ to XML to raise some events.
Module Module1 WithEvents root As XElement = <Root>content</Root> Sub Main() root.Add(<Child>child content</Child>) End Sub Private Sub root_Changing( _ ByVal sender As Object, _ ByVal e As XObjectChangeEventArgs) _ Handles root.Changing Dim xSender As XElement = DirectCast(sender, XElement) Console.WriteLine("Changing event raised") Console.WriteLine(" Sender: {0}", xSender.Name) Console.WriteLine(" ObjectChange: {0}", e.ObjectChange) End Sub Private Sub root_Changed( _ ByVal sender As Object, _ ByVal e As XObjectChangeEventArgs) _ Handles root.Changed Dim xSender As XElement = DirectCast(sender, XElement) Console.WriteLine("Changed event raised") Console.WriteLine(" Sender: {0}", xSender.Name) Console.WriteLine(" ObjectChange: {0}", e.ObjectChange) End Sub End Module
This example produces the following output:
Changing event raised Sender: Child ObjectChange: Add Changed event raised Sender: Child ObjectChange: Add
Events are useful when you want to maintain some aggregate information in an XML tree. For example, you may want maintain an invoice total that is the sum of the line items of the invoice. This example uses events to maintain the total of all of the child elements under the complex element Items.
Module Module1 Private total As XElement = Nothing Private WithEvents items As XElement = Nothing Private root As XElement = _ <Root> <Total>0</Total> <Items></Items> </Root> Sub Main() total = root.<Total>(0) items = root.<Items>(0) items.SetElementValue("Item1", 25) items.SetElementValue("Item2", 50) items.SetElementValue("Item2", 75) items.SetElementValue("Item3", 133) items.SetElementValue("Item1", Nothing) items.SetElementValue("Item4", 100) Console.WriteLine("Total:{0}", CInt(total)) Console.WriteLine(root) End Sub Private Sub XObjectChanged( _ ByVal sender As Object, _ ByVal cea As XObjectChangeEventArgs) _ Handles items.Changed Select Case cea.ObjectChange Case XObjectChange.Add If sender.GetType() Is GetType(XElement) Then total.Value = CStr(CInt(total.Value) + _ CInt((DirectCast(sender, XElement)).Value)) End If If sender.GetType() Is GetType(XText) Then total.Value = CStr(CInt(total.Value) + _ CInt((DirectCast(sender, XText)).Value)) End If Case XObjectChange.Remove If sender.GetType() Is GetType(XElement) Then total.Value = CStr(CInt(total.Value) - _ CInt((DirectCast(sender, XElement)).Value)) End If If sender.GetType() Is GetType(XText) Then total.Value = CStr(CInt(total.Value) - _ CInt((DirectCast(sender, XText)).Value)) End If End Select Console.WriteLine("Changed {0} {1}", _ sender.GetType().ToString(), _ cea.ObjectChange.ToString()) End Sub End Module
This code produces the following output:
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XText Remove
Changed System.Xml.Linq.XText Add
Changed System.Xml.Linq.XElement Add
Changed System.Xml.Linq.XElement Remove
Changed System.Xml.Linq.XElement Add
Total:308
<Root>
<Total>308</Total>
<Items>
<Item2>75</Item2>
<Item3>133</Item3>
<Item4>100</Item4>
</Items>
</Root>
Windows 7, Windows Vista, Windows XP SP2, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360, Zune
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.