https://bugzilla.novell.com/show_bug.cgi?id=664838
https://bugzilla.novell.com/show_bug.cgi?id=664838#c0 Summary: CurencyManager and PropertyManager GetItemProperties() method doesn't honor ITypedList. 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 CurencyManager and PropertyManager GetItemProperties() method don't return properties correctly, for example ITypedList honored which can be very useful when customising properties. Calling through to ListBindingHelper.GetListItemProperties would be helpful. Reproducible: Always Steps to Reproduce: [Test] public void Test_BindingManagers_GetItemProperties() { TypedList<TestDataSourceWithRelatedObjects> list = new TypedList<TestDataSourceWithRelatedObjects>(); TestDataSourceWithRelatedObjects item = list.AddNew(); item.List = new BindingList<TestDataSource>(); BindingContext bc = new BindingContext(); AssertPropertyDescriptorCollectionObjType(bc, list, "", typeof(TestDataSourceWithRelatedObjects)); AssertPropertyDescriptorCollectionObjType(bc, list, "ObjProperty", typeof(TestDataSource)); AssertPropertyDescriptorCollectionObjType(bc, list, "List", typeof(TestDataSource)); } static void AssertPropertyDescriptorCollectionObjType( BindingContext bc, object dataSource, string dataMember, Type objType) { var bm = bc[dataSource, dataMember]; MyPropertyDescriptorCollection properties = bm.GetItemProperties() as MyPropertyDescriptorCollection; if (properties == null) { throw new InvalidOperationException("GetItemProperties did not return a custom PropertyDescriptorCollection"); } AssertEquals( objType, properties.ObjType, "PropertyDescriptorCollection for " + objType + " returned for DataSource=" + ListUtil.GetListElementType(dataSource.GetType()).Name + " DataMember=" + dataMember); } class TypedList<T> : BindingList<T>, ITypedList { public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors) { return new MyPropertyDescriptorCollection( listAccessors == null ? typeof(T) : GetListElementType(listAccessors[listAccessors.Length - 1].PropertyType)); } Type GetListElementType(Type type) { return typeof(IEnumerable).IsAssignableFrom(type) ? ListUtil.GetListElementType(type) : type; } public string GetListName(PropertyDescriptor[] listAccessors) { return null; } } class MyPropertyDescriptorCollection : PropertyDescriptorCollection { public MyPropertyDescriptorCollection(Type objType) : base(null) { if (objType == null) { throw new ArgumentNullException("objType"); } ObjType = objType; foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(objType)) { Add(property); } } public Type ObjType { get; private set; } } class TestDataSourceWithRelatedObjects { public event EventHandler ObjPropertyChanged; TestDataSource objProperty; public TestDataSource ObjProperty { get { return objProperty; } set { objProperty = value; if (ObjPropertyChanged != null) { ObjPropertyChanged(this, EventArgs.Empty); } } } public BindingList<TestDataSource> List { get; set; } } class TestDataSource { } Actual Results: The unit test fails. Expected Results: The unit test should pass, as it does with ms.net. These changes fix the issue and cause the above test to pass: CurrencyManager.GetItemProperties changed to: public override PropertyDescriptorCollection GetItemProperties() { return GetItemProperties(null, null); } protected internal override PropertyDescriptorCollection GetItemProperties(ArrayList dataSources, ArrayList propertyAccessors) { return ListBindingHelper.GetListItemProperties( list, propertyAccessors == null ? null : (PropertyDescriptor[])propertyAccessors.ToArray(typeof(PropertyDescriptor))); } PropertyManager.GetItemProperties changed to: public override PropertyDescriptorCollection GetItemProperties() { return GetItemProperties(null, null); } protected internal override PropertyDescriptorCollection GetItemProperties(ArrayList dataSources, ArrayList listAccessors) { return ListBindingHelper.GetListItemProperties( data_source, listAccessors == null ? null : (PropertyDescriptor[])listAccessors.ToArray(typeof(PropertyDescriptor))); } RelatedCurrencyManager.GetItemProperties added: public override PropertyDescriptorCollection GetItemProperties() { return GetItemProperties(null, null); } protected internal override PropertyDescriptorCollection GetItemProperties(ArrayList dataSources, ArrayList listAccessors) { if (prop_desc == null) return new PropertyDescriptorCollection(null); ArrayList list = new ArrayList(1); list.Add(prop_desc); if (listAccessors != null && listAccessors.Count > 0) { list.AddRange(listAccessors); } return parent.GetItemProperties(null, list); } RelatedPropertyManager.GetItemProperties changed to: public override PropertyDescriptorCollection GetItemProperties() { return GetItemProperties(null, null); } protected internal override PropertyDescriptorCollection GetItemProperties(ArrayList dataSources, ArrayList listAccessors) { if (prop_desc == null) return new PropertyDescriptorCollection(null); ArrayList list = new ArrayList(1); list.Add(prop_desc); if (listAccessors != null && listAccessors.Count > 0) { list.AddRange(listAccessors); } return parent.GetItemProperties(null, list); } -- 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
