https://bugzilla.novell.com/show_bug.cgi?id=664828
https://bugzilla.novell.com/show_bug.cgi?id=664828#c0 Summary: Data binding pull should only happens if control XXXChanged event has fired Classification: Mono Product: Mono: Class Libraries Version: 2.6.x Platform: x86 OS/Version: Windows 7 Status: NEW Severity: Normal Priority: P5 - None Component: Windows.Forms AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: --- Blocker: --- User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1036 Safari/532.5 A data binding pull from the control to the data source should only occur if the control property XXXChanged event has fired, if that event is defined. Reproducible: Always Steps to Reproduce: Unit test to reproduce: [Test] public void Test_DataBindingPushOnlyIfControlPropertyChanged() { TestDataSource dataSource = new TestDataSource(); Control.DataBindings.Add("ControlValue", dataSource, "IntProperty"); Form.Controls.Add(Control); Control otherControl = new Control(); Form.Controls.Add(otherControl); Form.Show(); Application.DoEvents(); dataSource.IntPropertySet = false; otherControl.Focus(); Control.Focus(); Control.ControlValue = 2; otherControl.Focus(); AssertEquals(2, dataSource.IntProperty, "Property set from control to data source"); AssertEquals(true, dataSource.IntPropertySet, "Property set from control to data source"); dataSource.IntPropertySet = false; otherControl.Focus(); Control.Focus(); otherControl.Focus(); AssertEquals(2, dataSource.IntProperty, "Property set from control to data source"); AssertEquals(false, dataSource.IntPropertySet, "Property set from control to data source"); dataSource.IntPropertySet = false; } Form form; Form Form { get { return form ?? (form = new Form()); } } TestControl control; TestControl Control { get { return control ?? (control = new TestControl()); } } class TestControl : Control { public event EventHandler ControlValueChanged; public int ControlValue { get { int result; int.TryParse(Text, out result); return result; } set { Text = value.ToString(); if (ControlValueChanged != null) { ControlValueChanged(this, EventArgs.Empty); } } } } class TestDataSource { public event EventHandler IntPropertyChanged; public const int IntPropertyDefaultValue = 5; int intProperty = IntPropertyDefaultValue; public int IntProperty { get { return intProperty; } set { intProperty = value; if (IntPropertyChanged != null) { IntPropertyChanged(this, EventArgs.Empty); } IntPropertySet = true; } } public bool IntPropertySet { get; set; } } Actual Results: The unit test fails. Expected Results: The unit test should pass, as it does with ms.net. The changes below fixes and issue and cause the unit test above to pass. Code added to Binding: private bool modified; Code added to Binding.PullData: bool PullData (bool force) { if (control_property != null && control_property.SupportsChangeEvents && !modified) // line added return true; // line added if (IsBinding == false || manager.Current == null) return true; #if NET_2_0 if (!force && datasource_update_mode == DataSourceUpdateMode.Never) return true; #endif data = control_property.GetValue (control); #if NET_2_0 if (data == null) data = datasource_null_value; #endif try { SetPropertyValue (data); modified = false; // line added } catch (Exception e) { } Code added to Binding.PushData: try { data = FormatData (data); SetControlValue (data); modified = false; // line added Code added to Binding.ControlPropertyChangedHandler: void ControlPropertyChangedHandler (object o, EventArgs args) { modified = true; // line added if (datasource_update_mode != DataSourceUpdateMode.OnPropertyChanged) return; -- Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the QA contact for the bug. You are the assignee for the bug. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
