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