Author: calberto
Date: 2008-02-10 21:26:34 -0500 (Sun, 10 Feb 2008)
New Revision: 95411

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
Log:
2008-02-10  Carlos Alberto Cortez <[EMAIL PROTECTED]>

        * Binding.cs: For the 2.0 profile, look for a 
        'PropertyChanged' event in the target control, and add checks for
        DataSourceUpdateMode property to change -or not- the data source
        from validation/control property change.



Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs       
2008-02-10 21:21:54 UTC (rev 95410)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/Binding.cs       
2008-02-11 02:26:34 UTC (rev 95411)
@@ -95,7 +95,9 @@
                        //format_string = formatString;
                        //format_info = formatInfo;
 
-                       ConnectPropertyChangedEvent ();
+                       EventDescriptor prop_changed_event = 
GetPropertyChangedEvent (data_source, binding_member_info.BindingField);
+                       if (prop_changed_event != null)
+                               prop_changed_event.AddEventHandler 
(data_source, new EventHandler (SourcePropertyChangedHandler));
                }
 #else
                public Binding (string propertyName, object dataSource, string 
dataMember)
@@ -104,7 +106,10 @@
                        data_source = dataSource;
                        data_member = dataMember;
                        binding_member_info = new BindingMemberInfo 
(dataMember);
-                       ConnectPropertyChangedEvent ();
+                               
+                       EventDescriptor prop_changed_event = 
GetPropertyChangedEvent (data_source, binding_member_info.BindingField);
+                       if (prop_changed_event != null)
+                               prop_changed_event.AddEventHandler 
(data_source, new EventHandler (SourcePropertyChangedHandler));
                }               
 #endif
                #endregion      // Public Constructors
@@ -245,6 +250,11 @@
                                
                        data_type = control_property.PropertyType; // Getting 
the PropertyType is kinda slow and it should never change, so it is cached
                        control.Validating += new CancelEventHandler 
(ControlValidatingHandler);
+#if NET_2_0
+                       EventDescriptor prop_changed_event = 
GetPropertyChangedEvent (control, property_name);
+                       if (prop_changed_event != null)
+                               prop_changed_event.AddEventHandler (control, 
new EventHandler (ControlPropertyChangedHandler));
+#endif
 
                        this.control = control;
                }
@@ -381,6 +391,11 @@
 
                private void ControlValidatingHandler (object sender, 
CancelEventArgs e)
                {
+#if NET_2_0
+                       if (datasource_update_mode != 
DataSourceUpdateMode.OnValidation)
+                               return;
+#endif
+
                        object old_data = data;
 
                        // If the data doesn't seem to be valid (it can't be 
converted,
@@ -399,39 +414,40 @@
                        PushData ();
                }
 
-               void ConnectPropertyChangedEvent ()
+               EventDescriptor GetPropertyChangedEvent (object o, string 
property_name)
                {
-#if NET_2_0
-                       if (data_source == null || binding_member_info == new 
BindingMemberInfo (String.Empty) || binding_member_info.BindingField.Length == 
0)
-                               return;
-#else
-                       if (data_source == null || binding_member_info.Equals 
(new BindingMemberInfo (String.Empty)) || 
binding_member_info.BindingField.Length == 0)
-                               return;
-#endif
+                       if (o == null || property_name == null || 
property_name.Length == 0)
+                               return null;
 
-                       string event_name = binding_member_info.BindingField + 
"Changed";
+                       string event_name = property_name + "Changed";
                        Type event_handler_type = typeof (EventHandler);
 
                        EventDescriptor prop_changed_event = null;
-                       foreach (EventDescriptor event_desc in 
TypeDescriptor.GetEvents (data_source)) {
+                       foreach (EventDescriptor event_desc in 
TypeDescriptor.GetEvents (o)) {
                                if (event_desc.Name == event_name && 
event_desc.EventType == event_handler_type) {
                                        prop_changed_event = event_desc;
                                        break;
                                }
                        }
 
-                       // No event for property changes
-                       if (prop_changed_event == null)
-                               return;
-
-                       prop_changed_event.AddEventHandler (data_source, new 
EventHandler (PropertyChangedHandler));
+                       return prop_changed_event;
                }
 
-               void PropertyChangedHandler (object o, EventArgs args)
+               void SourcePropertyChangedHandler (object o, EventArgs args)
                {
                        PushData ();
                }
 
+#if NET_2_0
+               void ControlPropertyChangedHandler (object o, EventArgs args)
+               {
+                       if (datasource_update_mode != 
DataSourceUpdateMode.OnPropertyChanged)
+                               return;
+
+                       PullData ();
+               }
+#endif
+
                private object ParseData (object data, Type data_type)
                {
                        ConvertEventArgs e = new ConvertEventArgs (data, 
data_type);

Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2008-02-10 21:21:54 UTC (rev 95410)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2008-02-11 02:26:34 UTC (rev 95411)
@@ -1,3 +1,10 @@
+2008-02-10  Carlos Alberto Cortez <[EMAIL PROTECTED]>
+
+       * Binding.cs: For the 2.0 profile, look for a 
+       'PropertyChanged' event in the target control, and add checks for
+       DataSourceUpdateMode property to change -or not- the data source
+       from validation/control property change.
+
 2008-02-10  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * Binding.cs : build fix (operator == is not overriden in 1.x. Do

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to