[Mono-bugs] [Bug 664839] New: PropertyManager property change doesn't update child binding managers

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Sun Jan 16 18:13:23 EST 2011


https://bugzilla.novell.com/show_bug.cgi?id=664839

https://bugzilla.novell.com/show_bug.cgi?id=664839#c0


           Summary: PropertyManager property change doesn't update child
                    binding managers
    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: mono-bugs at lists.ximian.com
        ReportedBy: cvolzke at live.com.au
         QAContact: mono-bugs at lists.ximian.com
          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

When the property of a parent PropertyManager changes, the child binding
managers don't update.


Reproducible: Always

Steps to Reproduce:
[Test]
public void Test_WhenParent_PropertyManager_PropertyChanges()
{
    TestDataSourceWithRelatedObjects obj = new
TestDataSourceWithRelatedObjects();
    obj.ObjProperty = new TestDataSource { List = new
BindingList<TestDataSource> { new TestDataSource { IntProperty = 1 } } };

    BindingContext bc = new BindingContext();
    PropertyManager parentBindingManager = (PropertyManager)bc[obj,
"ObjProperty"];
    BindingManagerBase bm = bc[obj, "ObjProperty.List"];

    AssertEquals(1, ((TestDataSource)bm.Current).IntProperty, "Initial value of
ObjProperty.List[0].IntProperty");
    obj.ObjProperty = new TestDataSource { List = new
BindingList<TestDataSource> { new TestDataSource { IntProperty = 2 } } };
    AssertEquals(2, ((TestDataSource)bm.Current).IntProperty, "Value of
ObjProperty.List[0].IntProperty");
}

class TestDataSourceWithRelatedObjects
{
    public BindingList<TestDataSource> List { get; set; }
}

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);
            }
        }
    }
}

Actual Results:  
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 unit test to pass:

Code modified in RelatedCurrencyManager constructor:
    public RelatedCurrencyManager (BindingManagerBase parent,
PropertyDescriptor prop_desc)
        : base (prop_desc.GetValue (parent.Current))
    {
        this.parent = parent;
        this.prop_desc = prop_desc;

        parent.CurrentItemChanged += new
EventHandler(parent_CurrentItemChanged); // line added
        //parent.PositionChanged += new EventHandler(parent_PositionChanged);
// line removed - PositionChanged is never fired from a PropertyManager
    }

Code modified in RelatedCurrencyManager.parent_PositionChanged:
    private void parent_CurrentItemChanged(object sender, EventArgs args) //
line added
    //private void parent_PositionChanged (object sender, EventArgs args) //
line removed
    {
        if (parent.Position == -1) return; // line added to prevent
IndexOutOfRangeException
        SetDataSource (prop_desc.GetValue (parent.Current));
    }

Code modified in PropertyManager.OnCurrentChanged:
    protected internal override void OnCurrentChanged (EventArgs ea)
    {
        PushData ();

        if (onCurrentChangedHandler != null) {
            onCurrentChangedHandler (this, ea);
        }

        // CurrentChanged implies CurrentItemChanged here // line added
        if (onCurrentItemChangedHandler != null)          // line added
        {                                                 // line added
            onCurrentItemChangedHandler(this, ea);        // line added
        }                                                 // line added
    }

Code modified in ListBindingHelper.GetListItemProperties:
    public static PropertyDescriptorCollection GetListItemProperties (object
list, PropertyDescriptor [] listAccessors)
    {
        list = GetList (list);

        if (list == null)
            return new PropertyDescriptorCollection (null);

        if (list is ITypedList)
            return ((ITypedList)list).GetItemProperties (listAccessors);

        if (listAccessors == null || listAccessors.Length == 0) {
            Type item_type = GetListItemType (list);
            return TypeDescriptor.GetProperties (item_type, 
                new Attribute [] { new BrowsableAttribute (true) });
        }

        // Take into account only the first property
        Type property_type = listAccessors[listAccessors.Length -
1].PropertyType; // line added
        //Type property_type = listAccessors [0].PropertyType;                 
   // line removed
        if (typeof (IList).IsAssignableFrom (property_type)
#if NET_2_0
            || typeof (IList<>).IsAssignableFrom (property_type)
#endif
            ) {

            PropertyInfo property = GetPropertyByReflection (property_type,
"Item");
            return TypeDescriptor.GetProperties (property.PropertyType);
        }

        return TypeDescriptor.GetProperties(property_type);                    
// line added
        //return new PropertyDescriptorCollection (new PropertyDescriptor [0]);
// line removed
    }

-- 
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.


More information about the mono-bugs mailing list