2006-12-26 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / Binding.cs
index c693671d4a7aaf858a4dc9571b3143aa63724db0..7fe7b29b1e89c9b9f6f71ebda8ceb1939cce8e15 100644 (file)
@@ -43,10 +43,6 @@ namespace System.Windows.Forms {
                private PropertyDescriptor control_property;
                private PropertyDescriptor is_null_desc;
 
-               private EventDescriptor changed_event;
-               private EventHandler property_value_changed_handler;
-               private object event_current; // The manager.Current as far as the changed_event knows
-
                private object data;
                private Type data_type;
 
@@ -125,7 +121,7 @@ namespace System.Windows.Forms {
                                return;
 
                        control_property = TypeDescriptor.GetProperties (control).Find (property_name, true);                   
-                       
+
                        if (control_property == null)
                                throw new ArgumentException (String.Concat ("Cannot bind to property '", property_name, "' on target control."));
                        if (control_property.IsReadOnly)
@@ -135,7 +131,6 @@ namespace System.Windows.Forms {
                        control.Validating += new CancelEventHandler (ControlValidatingHandler);
 
                        this.control = control;
-                       control.DataBindings.Add (this);
                }
 
                internal void Check (BindingContext binding_context)
@@ -143,8 +138,6 @@ namespace System.Windows.Forms {
                        if (control == null || control.BindingContext == null)
                                return;
 
-                       Console.WriteLine ("data source  {0}   member name:  {1}",
-                                          data_source, data_member);
                        manager = control.BindingContext [data_source, data_member];
 
                        manager.AddBinding (this);
@@ -162,13 +155,12 @@ namespace System.Windows.Forms {
                                return;
 
                        data = control_property.GetValue (control);
-                       data = ParseData (data, manager.Current.GetType());
                        SetPropertyValue (data);
                }
 
                internal void PushData ()
                {
-                       if (IsBinding == false || manager.Current == null)
+                       if (manager == null || manager.IsSuspended || manager.Current == null)
                                return;
 
                        if (is_null_desc != null) {
@@ -182,8 +174,7 @@ namespace System.Windows.Forms {
                        PropertyDescriptor pd = TypeDescriptor.GetProperties (manager.Current).Find (binding_member_info.BindingField, true);
                        if (pd == null) {
                                data = ParseData (manager.Current, manager.Current.GetType ());
-                       }
-                       else {
+                       } else {
                                data = ParseData (pd.GetValue (manager.Current), pd.PropertyType);
                        }
 
@@ -203,10 +194,11 @@ namespace System.Windows.Forms {
 
                private void SetPropertyValue (object data)
                {
-                       PropertyDescriptor pd = TypeDescriptor.GetProperties (data_source).Find (binding_member_info.BindingField, true);
+                       PropertyDescriptor pd = TypeDescriptor.GetProperties (manager.Current).Find (binding_member_info.BindingField, true);
                        if (pd.IsReadOnly)
                                return;
-                       pd.SetValue (data_source, data);
+                       data = ParseData (data, pd.PropertyType);
+                       pd.SetValue (manager.Current, data);
                }
 
                private void CurrentChangedHandler (object sender, EventArgs e)
@@ -216,7 +208,16 @@ namespace System.Windows.Forms {
 
                private void ControlValidatingHandler (object sender, CancelEventArgs e)
                {
-                       PullData ();
+                       object old_data = data;
+
+                       // If the data doesn't seem to be valid (it can't be converted,
+                       // is the wrong type, etc, we reset to the old data value.
+                       try {
+                               PullData ();
+                       } catch {
+                               data = old_data;
+                               SetControlValue (data);
+                       }
                }
 
                private void PositionChangedHandler (object sender, EventArgs e)