Sfoglia il codice sorgente

OnBubleEvent works properly - controls like Button, LinkButton nested into template can raise MenuItemClick event

ViewState of Items saved and restored properly.

svn path=/trunk/mcs/; revision=63762
Igor Zelmanovich 19 anni fa
parent
commit
e34993e155

+ 7 - 0
mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog

@@ -1,3 +1,10 @@
+2006-08-15 Igor Zelmanovich <[email protected]>
+
+	* Menu.cs: fixed: 
+	OnBubleEvent works properly - controls like Button, LinkButton nested into template
+	can raise MenuItemClick event,
+	ViewState of Items saved and restored properly.
+
 2006-08-14 Andrew Skiba <[email protected]>
 
 	* TableStyle.cs: replace ResolveUrl with ResolveClientUrl to match

+ 15 - 5
mcs/class/System.Web/System.Web.UI.WebControls/Menu.cs

@@ -753,7 +753,9 @@ namespace System.Web.UI.WebControls
 				EnsureChildControlsDataBound ();
 				return;
 			}
-			
+
+			InitializeDataBindings ();
+
 			HierarchicalDataSourceView data = GetData ("");
 
 			if (data == null) {
@@ -1036,10 +1038,15 @@ namespace System.Web.UI.WebControls
 			base.DataBind ();
 		}
 		
-		[MonoTODO]
-		protected override bool OnBubbleEvent (object source, EventArgs e)
+		protected override bool OnBubbleEvent (object source, EventArgs args)
 		{
-			throw new NotImplementedException ();
+			if (!(args is CommandEventArgs))
+				return false;
+
+			MenuEventArgs menuArgs = args as MenuEventArgs;
+			if (menuArgs != null && string.Equals (menuArgs.CommandName, MenuItemClickCommandName))
+				OnMenuItemClick (menuArgs);
+			return true;
 		}
 
 		protected override void OnDataBinding (EventArgs e)
@@ -1109,9 +1116,12 @@ namespace System.Web.UI.WebControls
 			
 			Page.ClientScript.RegisterStartupScript (typeof(Menu), ClientID, script, true);
 
+		}
+
+		void InitializeDataBindings () {
 			if (dataBindings != null && dataBindings.Count > 0) {
 				bindings = new Hashtable ();
-				foreach (TreeNodeBinding bin in dataBindings) {
+				foreach (MenuItemBinding bin in dataBindings) {
 					string key = GetBindingKey (bin.DataMember, bin.Depth);
 					bindings [key] = bin;
 				}

+ 142 - 131
mcs/class/System.Web/System.Web.UI.WebControls/MenuItem.cs

@@ -50,8 +50,6 @@ namespace System.Web.UI.WebControls
 		string path;
 		int depth = -1;
 		
-		bool dataBound;
-		string dataPath;
 		object dataItem;
 		IHierarchyData hierarchyData;
 		
@@ -130,14 +128,15 @@ namespace System.Web.UI.WebControls
 		[DefaultValue (false)]
 		[Browsable (false)]
 		public bool DataBound {
-			get { return dataBound; }
+			get { return ViewState ["DataBound"] == null ? false : (bool) ViewState ["DataBound"]; }
+			private set { ViewState ["DataBound"] = value; }
 		}
 		
 		[DefaultValue (null)]
 		[Browsable (false)]
 		public object DataItem {
 			get {
-				if (!dataBound) throw new InvalidOperationException ("MenuItem is not data bound.");
+				if (!DataBound) throw new InvalidOperationException ("MenuItem is not data bound.");
 				return dataItem;
 			}
 		}
@@ -147,8 +146,10 @@ namespace System.Web.UI.WebControls
 		[Browsable (false)]
 		public string DataPath {
 			get {
-				if (!dataBound) throw new InvalidOperationException ("MenuItem is not data bound.");
-				return dataPath;
+				return ViewState ["DataPath"] == null ? String.Empty : (String) ViewState ["DataPath"];
+			}
+			set {
+				ViewState ["DataPath"] = value;
 			}
 		}
 		
@@ -172,17 +173,7 @@ namespace System.Web.UI.WebControls
 		[Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
 		public string ImageUrl {
 			get {
-				object o = ViewState ["ImageUrl"];
-				if (o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.ImageUrlField != "")
-							return (string) GetBoundPropertyValue (bin.ImageUrlField);
-						return bin.ImageUrl;
-					}
-				}
-				return "";
+				return ViewState ["ImageUrl"] == null ? String.Empty : (String) ViewState ["ImageUrl"];
 			}
 			set {
 				ViewState ["ImageUrl"] = value;
@@ -194,17 +185,7 @@ namespace System.Web.UI.WebControls
 		[Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
 		public string NavigateUrl {
 			get {
-				object o = ViewState ["NavigateUrl"];
-				if (o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.NavigateUrlField != "")
-							return (string) GetBoundPropertyValue (bin.NavigateUrlField);
-						return bin.NavigateUrl;
-					}
-				}
-				return "";
+				return ViewState ["NavigateUrl"] == null ? String.Empty : (String) ViewState ["NavigateUrl"];
 			}
 			set {
 				ViewState ["NavigateUrl"] = value;
@@ -216,17 +197,7 @@ namespace System.Web.UI.WebControls
 		[Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
 		public string PopOutImageUrl {
 			get {
-				object o = ViewState ["PopOutImageUrl"];
-				if (o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.PopOutImageUrlField != "")
-							return (string) GetBoundPropertyValue (bin.PopOutImageUrlField);
-						return bin.PopOutImageUrl;
-					}
-				}
-				return "";
+				return ViewState ["PopOutImageUrl"] == null ? String.Empty : (String) ViewState ["PopOutImageUrl"];
 			}
 			set {
 				ViewState ["PopOutImageUrl"] = value;
@@ -236,17 +207,7 @@ namespace System.Web.UI.WebControls
 		[DefaultValue ("")]
 		public string Target {
 			get {
-				object o = ViewState ["Target"];
-				if(o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.TargetField != "")
-							return (string) GetBoundPropertyValue (bin.TargetField);
-						return bin.Target;
-					}
-				}
-				return "";
+				return ViewState ["Target"] == null ? String.Empty : (String) ViewState ["Target"];
 			}
 			set {
 				ViewState ["Target"] = value;
@@ -257,26 +218,7 @@ namespace System.Web.UI.WebControls
 		[DefaultValue ("")]
 		public string Text {
 			get {
-				object o = ViewState ["Text"];
-				if (o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						string text;
-						if (bin.TextField != "")
-							text = (string) GetBoundPropertyValue (bin.TextField);
-						else if (bin.Text != "")
-							text = bin.Text;
-						else
-							text = GetDefaultBoundText ();
-							
-						if (bin.FormatString.Length != 0)
-							text = string.Format (bin.FormatString, text);
-						return text;
-					}
-					return GetDefaultBoundText ();
-				}
-				return "";
+				return ViewState ["Text"] == null ? String.Empty : (String) ViewState ["Text"];
 			}
 			set {
 				ViewState ["Text"] = value;
@@ -287,17 +229,7 @@ namespace System.Web.UI.WebControls
 		[DefaultValue ("")]
 		public string ToolTip {
 			get {
-				object o = ViewState ["ToolTip"];
-				if(o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.ToolTipField != "")
-							return (string) GetBoundPropertyValue (bin.ToolTipField);
-						return bin.ToolTip;
-					}
-				}
-				return "";
+				return ViewState ["ToolTip"] == null ? String.Empty : (String) ViewState ["ToolTip"];
 			}
 			set {
 				ViewState ["ToolTip"] = value;
@@ -308,19 +240,7 @@ namespace System.Web.UI.WebControls
 		[DefaultValue ("")]
 		public string Value {
 			get {
-				object o = ViewState ["Value"];
-				if(o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.ValueField != "")
-							return (string) GetBoundPropertyValue (bin.ValueField);
-						if (bin.Value != "")
-							return bin.Value;
-					}
-					return GetDefaultBoundText ();
-				}
-				return "";
+				return ViewState ["Value"] == null ? String.Empty : (String) ViewState ["Value"];
 			}
 			set {
 				ViewState ["Value"] = value;
@@ -332,17 +252,7 @@ namespace System.Web.UI.WebControls
 		[Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
 		public string SeparatorImageUrl {
 			get {
-				object o = ViewState ["SeparatorImageUrl"];
-				if (o != null) return (string)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.SeparatorImageUrlField != "")
-							return (string) GetBoundPropertyValue (bin.SeparatorImageUrlField);
-						return bin.SeparatorImageUrl;
-					}
-				}
-				return "";
+				return ViewState ["SeparatorImageUrl"] == null ? String.Empty : (String) ViewState ["SeparatorImageUrl"];
 			}
 			set {
 				ViewState ["SeparatorImageUrl"] = value;
@@ -353,17 +263,7 @@ namespace System.Web.UI.WebControls
 	    [DefaultValueAttribute (true)]
 		public bool Selectable {
 			get {
-				object o = ViewState ["Selectable"];
-				if (o != null) return (bool)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.SelectableField != "")
-							return (bool) GetBoundPropertyValue (bin.SelectableField);
-						return bin.Selectable;
-					}
-				}
-				return true;
+				return ViewState ["Selectable"] == null ? true : (bool) ViewState ["Selectable"];
 			}
 			set {
 				ViewState ["Selectable"] = value;
@@ -374,17 +274,7 @@ namespace System.Web.UI.WebControls
 	    [DefaultValueAttribute (true)]
 		public bool Enabled {
 			get {
-				object o = ViewState ["Enabled"];
-				if (o != null) return (bool)o;
-				if (DataBound) {
-					MenuItemBinding bin = GetBinding ();
-					if (bin != null) {
-						if (bin.EnabledField != "")
-							return (bool) GetBoundPropertyValue (bin.EnabledField);
-						return bin.Enabled;
-					}
-				}
-				return true;
+				return ViewState ["Enabled"] == null ? true : (bool) ViewState ["Enabled"];
 			}
 			set {
 				ViewState ["Enabled"] = value;
@@ -509,6 +399,8 @@ namespace System.Web.UI.WebControls
 		internal void SetDirty ()
 		{
 			ViewState.SetDirty (true);
+			if (items != null)
+				items.SetDirty ();
 		}
 		
 		object ICloneable.Clone ()
@@ -526,9 +418,128 @@ namespace System.Web.UI.WebControls
 		internal void Bind (IHierarchyData hierarchyData)
 		{
 			this.hierarchyData = hierarchyData;
-			dataBound = true;
-			dataPath = hierarchyData.Path;
+			DataBound = true;
+			DataPath = hierarchyData.Path;
 			dataItem = hierarchyData.Item;
+
+			MenuItemBinding bin = GetBinding ();
+			if (bin != null) {
+
+				// Bind Enabled property
+
+				if (bin.EnabledField != "")
+					try { Enabled = Convert.ToBoolean (GetBoundPropertyValue (bin.EnabledField)); }
+					catch { Enabled = bin.Enabled; }
+				else
+					Enabled = bin.Enabled;
+
+				// Bind ImageUrl property
+
+				if (bin.ImageUrlField.Length > 0) {
+					ImageUrl = Convert.ToString (GetBoundPropertyValue (bin.ImageUrlField));
+					if (ImageUrl.Length == 0)
+						ImageUrl = bin.ImageUrl;
+				}
+				else if (bin.ImageUrl.Length > 0)
+					ImageUrl = bin.ImageUrl;
+
+				// Bind NavigateUrl property
+
+				if (bin.NavigateUrlField.Length > 0) {
+					NavigateUrl = Convert.ToString (GetBoundPropertyValue (bin.NavigateUrlField));
+					if (NavigateUrl.Length == 0)
+						NavigateUrl = bin.NavigateUrl;
+				}
+				else if (bin.NavigateUrl.Length > 0)
+					NavigateUrl = bin.NavigateUrl;
+
+				// Bind PopOutImageUrl property
+
+				if (bin.PopOutImageUrlField.Length > 0) {
+					PopOutImageUrl = Convert.ToString (GetBoundPropertyValue (bin.PopOutImageUrlField));
+					if (PopOutImageUrl.Length == 0)
+						PopOutImageUrl = bin.PopOutImageUrl;
+				}
+				else if (bin.PopOutImageUrl.Length > 0)
+					PopOutImageUrl = bin.PopOutImageUrl;
+
+				// Bind Selectable property
+
+				if (bin.SelectableField != "")
+					try { Selectable = Convert.ToBoolean (GetBoundPropertyValue (bin.SelectableField)); }
+					catch { Selectable = bin.Selectable; }
+				else
+					Selectable = bin.Selectable;
+
+				// Bind SeparatorImageUrl property
+
+				if (bin.SeparatorImageUrlField.Length > 0) {
+					SeparatorImageUrl = Convert.ToString (GetBoundPropertyValue (bin.SeparatorImageUrlField));
+					if (SeparatorImageUrl.Length == 0)
+						SeparatorImageUrl = bin.SeparatorImageUrl;
+				}
+				else if (bin.SeparatorImageUrl.Length > 0)
+					SeparatorImageUrl = bin.SeparatorImageUrl;
+
+				// Bind Target property
+
+				if (bin.SeparatorImageUrlField.Length > 0) {
+					Target = Convert.ToString (GetBoundPropertyValue (bin.TargetField));
+					if (Target.Length == 0)
+						Target = bin.Target;
+				}
+				else if (bin.Target.Length > 0)
+					Target = bin.Target;
+
+				// Bind Target property
+
+				if (bin.ToolTipField.Length > 0) {
+					ToolTip = Convert.ToString (GetBoundPropertyValue (bin.ToolTipField));
+					if (ToolTip.Length == 0)
+						ToolTip = bin.ToolTip;
+				}
+				else if (bin.ToolTip.Length > 0)
+					ToolTip = bin.ToolTip;
+
+				// Bind Value property
+
+				if (bin.ValueField.Length > 0) {
+					Value = Convert.ToString (GetBoundPropertyValue (bin.ValueField));
+					if (Value.Length == 0)
+						Value = bin.Value;
+					if (Value.Length == 0)
+						Value = bin.Text;
+				}
+				else if (bin.Value.Length > 0)
+					Value = bin.Value;
+				else if (bin.Text.Length > 0)
+					Value = bin.Text;
+				else
+					Value = GetDefaultBoundText ();
+				
+				// Bind Text property
+
+				if (bin.TextField.Length > 0) {
+					Text = Convert.ToString (GetBoundPropertyValue (bin.TextField));
+					if (bin.FormatString.Length > 0)
+						Text = string.Format (bin.FormatString, Text);
+					if (Text.Length == 0)
+						Text = bin.Text;
+					if (Text.Length == 0)
+						Text = bin.Value;
+				}
+				else if (bin.Text.Length > 0)
+					Text = bin.Text;
+				else if (bin.Value.Length > 0)
+					Text = bin.Value;
+				else
+					Text = GetDefaultBoundText ();
+
+			}
+			else {
+				Text = Value = GetDefaultBoundText ();
+			}
+
 			INavigateUIData navigateUIData = hierarchyData as INavigateUIData;
 			if (navigateUIData != null) {
 				Text = navigateUIData.ToString ();
@@ -543,12 +554,12 @@ namespace System.Web.UI.WebControls
 		
 		internal void SetDataPath (string path)
 		{
-			dataPath = path;
+			DataPath = path;
 		}
 		
 		internal void SetDataBound (bool bound)
 		{
-			dataBound = bound;
+			DataBound = bound;
 		}
 		
 		string GetDefaultBoundText ()

+ 6 - 0
mcs/class/System.Web/System.Web.UI.WebControls/MenuItemCollection.cs

@@ -81,6 +81,12 @@ namespace System.Web.UI.WebControls
 				dirty = true;
 			}
 		}
+
+		internal void SetDirty () {
+			for (int n = 0; n < Count; n++)
+				this [n].SetDirty ();
+			dirty = true;
+		}
 		
 		public void AddAt (int index, MenuItem child)
 		{

+ 7 - 2
mcs/class/System.Web/System.Web.UI.WebControls/MenuItemTemplateContainer.cs

@@ -47,10 +47,15 @@ namespace System.Web.UI.WebControls
 			dataItem = menuItem;
 		}
 		
-		[MonoTODO]
 		protected override bool OnBubbleEvent (object source, EventArgs args)
 		{
-			return base.OnBubbleEvent (source, args);
+			CommandEventArgs command = args as CommandEventArgs;
+			if (command == null)
+				return false;
+
+			MenuEventArgs menuArgs = new MenuEventArgs ((MenuItem) DataItem, source, command);
+			RaiseBubbleEvent (this, menuArgs);
+			return true;
 		}
 		
 		[MonoTODO]

+ 2 - 2
mcs/class/System.Web/System.Web.UI.WebControls/XmlHierarchyData.cs

@@ -151,8 +151,8 @@ namespace System.Web.UI.WebControls {
 						prev = prev.PreviousSibling;
 						n++;
 					}
-					
-					sb.Insert (0, "/*[position()=" + n);
+
+					sb.Insert (0, "/*[position()=" + n + "]");
 					nod = nod.ParentNode;
 				} while (nod != null && !(nod is XmlDocument));
 				

+ 4 - 0
mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog

@@ -1,3 +1,7 @@
+2006-08-15 Igor Zelmanovich <[email protected]>
+
+	* MenuTest.cs: new test was added, removed NotWorking attributes
+
 2006-08-15 Igor Zelmanovich <[email protected]>
 
 	* MenuTest.cs: new tests were added.

+ 58 - 6
mcs/class/System.Web/Test/System.Web.UI.WebControls/MenuTest.cs

@@ -632,7 +632,6 @@ namespace MonoTests.System.Web.UI.WebControls
 		}
 
 		[Test]
-		[Category ("NotWorking")]
 		public void Menu_ViewStateItems () {
 			PokerMenu b = new PokerMenu ();
 			MenuItem R = new MenuItem ("root", "value-root");
@@ -655,7 +654,6 @@ namespace MonoTests.System.Web.UI.WebControls
 
 
 		[Test]
-		[Category ("NotWorking")]
 		public void Menu_ViewStateDataBoundItems () {
 			PokerMenu b = new PokerMenu ();
 			SetDataBindings (b);
@@ -669,7 +667,7 @@ namespace MonoTests.System.Web.UI.WebControls
 
 		private static void CheckMenuItems (Menu m) {
 			Assert.AreEqual (1, m.Items.Count, "CheckMenuItems#1");
-			Assert.AreEqual (3, m.Items [0].ChildItems.Count, "CheckMenuItems#2");
+			Assert.AreEqual (10, m.Items [0].ChildItems.Count, "CheckMenuItems#2");
 			Assert.AreEqual (0, m.Items [0].ChildItems [0].ChildItems.Count, "CheckMenuItems#3");
 			Assert.AreEqual (true, m.Items [0].ChildItems [0].DataBound, "CheckMenuItems#4");
 			Assert.AreEqual ("/*[position()=1]/*[position()=1]", m.Items [0].ChildItems [0].DataPath, "CheckMenuItems#5");
@@ -733,6 +731,25 @@ namespace MonoTests.System.Web.UI.WebControls
 			Assert.AreEqual ("value#2", m.Items [0].ChildItems [1].Value, "CheckMenuItems_Value#3");
 			Assert.AreEqual ("value#default", m.Items [0].ChildItems [2].Value, "CheckMenuItems_Value#4");
 			Assert.AreEqual ("subnode", m.Items [0].ChildItems [2].ChildItems [0].Value, "CheckMenuItems_Value#5");
+
+			Assert.AreEqual ("text#extra1", m.Items [0].ChildItems [3].Text, "CheckMenuItems_Extra1#1");
+			Assert.AreEqual ("text#extra1", m.Items [0].ChildItems [3].Value, "CheckMenuItems_Extra1#2");
+
+			Assert.AreEqual ("value#extra2", m.Items [0].ChildItems [4].Text, "CheckMenuItems_Extra2#1");
+			Assert.AreEqual ("value#extra2", m.Items [0].ChildItems [4].Value, "CheckMenuItems_Extra2#2");
+
+			Assert.AreEqual ("text#extra3", m.Items [0].ChildItems [5].Text, "CheckMenuItems_Extra3#1");
+			Assert.AreEqual ("", m.Items [0].ChildItems [5].Value, "CheckMenuItems_Extra3#2");
+			Assert.AreEqual ("", m.Items [0].ChildItems [6].Text, "CheckMenuItems_Extra3#3");
+			Assert.AreEqual ("value#extra3", m.Items [0].ChildItems [6].Value, "CheckMenuItems_Extra3#4");
+			Assert.AreEqual ("", m.Items [0].ChildItems [7].Text, "CheckMenuItems_Extra3#5");
+			Assert.AreEqual ("", m.Items [0].ChildItems [7].Value, "CheckMenuItems_Extra3#6");
+
+			Assert.AreEqual ("text#extra4", m.Items [0].ChildItems [8].Text, "CheckMenuItems_Extra4#1");
+			Assert.AreEqual ("text#default", m.Items [0].ChildItems [8].Value, "CheckMenuItems_Extra4#2");
+
+			Assert.AreEqual ("value#default", m.Items [0].ChildItems [9].Text, "CheckMenuItems_Extra5#1");
+			Assert.AreEqual ("value#extra5", m.Items [0].ChildItems [9].Value, "CheckMenuItems_Extra5#2");
 		}
 
 		void SetDataBindings (Menu menu) {
@@ -774,6 +791,36 @@ namespace MonoTests.System.Web.UI.WebControls
 			b.ToolTip = "tooltip#root";
 			b.Value = "value#root";
 			menu.DataBindings.Add (b);
+
+			b = new MenuItemBinding ();
+			b.DataMember = "extra1";
+			b.Text = "text#extra1";
+			menu.DataBindings.Add (b);
+
+			b = new MenuItemBinding ();
+			b.DataMember = "extra2";
+			b.Value = "value#extra2";
+			menu.DataBindings.Add (b);
+
+			b = new MenuItemBinding ();
+			b.DataMember = "extra3";
+			b.TextField = "text";
+			b.ValueField = "value";
+			menu.DataBindings.Add (b);
+
+			b = new MenuItemBinding ();
+			b.DataMember = "extra4";
+			b.TextField = "text";
+			b.Text = "text#default";
+			b.ValueField = "value";
+			menu.DataBindings.Add (b);
+
+			b = new MenuItemBinding ();
+			b.DataMember = "extra5";
+			b.TextField = "text";
+			b.Value = "value#default";
+			b.ValueField = "value";
+			menu.DataBindings.Add (b);
 		}
 
 		XmlDataSource CreateXmlDataSource () {
@@ -784,12 +831,18 @@ namespace MonoTests.System.Web.UI.WebControls
 				"<node url=\"url#2\" img=\"img#2\" enabled=\"false\" selectable=\"false\" popoutimg=\"popoutimg#2\" separatorimg=\"separatorimg#2\" target=\"target#2\" text=\"2\" tooltip=\"tooltip#2\" value=\"value#2\" />" +
 				"<node url=\"\" img=\"\" enabled=\"\" selectable=\"\" popoutimg=\"\" separatorimg=\"\" target=\"\" text=\"\" tooltip=\"\" value=\"\">" +
 				"<subnode url=\"url#unreachable\" img=\"img#unreachable\" enabled=\"false\" selectable=\"false\" popoutimg=\"popoutimg#unreachable\" separatorimg=\"separatorimg#unreachable\" target=\"target#unreachable\" text=\"text#unreachable\" tooltip=\"tooltip#unreachable\" value=\"value#unreachable\" />" +
-				"<subnode /></node></root>";
+				"<subnode /></node>"+
+				"<extra1 /><extra2 />"+
+				"<extra3 text=\"text#extra3\" value=\"\" />" +
+				"<extra3 text=\"\" value=\"value#extra3\" />" +
+				"<extra3 text=\"\" value=\"\" />" +
+				"<extra4 text=\"text#extra4\" value=\"\" />" +
+				"<extra5 text=\"\" value=\"value#extra5\" />" +
+				"</root>";
 			return xmlDs;
 		}
 
 		[Test]
-		[Category ("NotWorking")]
 		public void Menu_DataBindings () {
 			Menu m = new Menu ();
 			SetDataBindings (m);
@@ -954,7 +1007,6 @@ namespace MonoTests.System.Web.UI.WebControls
 		        Assert.AreEqual (true, OnMenuItemDataBound, "AfterMenuItemDataBound");
 		}
 		[Test]
-		[Category ("NotWorking")]
 		public void Menu_BubbleEvent () {
 			PokerMenu pm = new PokerMenu ();
 			MenuItem item = new MenuItem ("Root");