private void UpdateItems()
        {
            ++_updating;
            try
            {
                if (GetItems != null)
                {
                    // Use the adapter if the check state event is not defined.
                    GetObjectCheckStateDelegate getItemCheckState = GetItemCheckState;
                    if (getItemCheckState == null)
                    {
                        getItemCheckState = new GetObjectCheckStateDelegate(AdaptGetItemCheckState);
                    }
                    SetObjectCheckStateDelegate setItemCheckState = SetItemCheckState;
                    if (setItemCheckState == null)
                    {
                        setItemCheckState = new SetObjectCheckStateDelegate(AdaptSetItemCheckState);
                    }

                    // Recycle the collection of items.
                    ArrayList newItems = new ArrayList(base.Items.Count);
                    using (var recycleBin = new RecycleBin <CheckedListBoxItem>())
                    {
                        foreach (CheckedListBoxItem item in base.Items)
                        {
                            recycleBin.AddObject(item);
                        }

                        // Extract each item from the recycle bin.
                        foreach (object item in GetItems())
                        {
                            newItems.Add(recycleBin.Extract(
                                             new CheckedListBoxItem(item, GetItemText, getItemCheckState, setItemCheckState)));
                        }
                    }

                    // Replace the items in the control.
                    base.BeginUpdate();
                    try
                    {
                        // Make sure the same tag is selected.
                        CheckedListBoxItem selectedItem = (CheckedListBoxItem)base.SelectedItem;
                        object             selectedTag  = selectedItem == null ? null : selectedItem.Tag;
                        base.Items.Clear();
                        base.Items.AddRange(newItems.ToArray());
                        base.SelectedIndex = IndexOfTag(selectedTag);
                    }
                    finally
                    {
                        base.EndUpdate();
                    }
                }
            }
            finally
            {
                --_updating;
            }
        }
 public CheckedListBoxItem(object tag, GetObjectStringDelegate getItemText, GetObjectCheckStateDelegate getItemCheckState, SetObjectCheckStateDelegate setItemCheckState)
 {
     _tag               = tag;
     _getItemText       = getItemText;
     _getItemCheckState = getItemCheckState;
     _setItemCheckState = setItemCheckState;
     _depText           = Dependent.New("CheckedListBoxItem.Text", UpdateText);
     _depCheckState     = Dependent.New("CheckedListBoxItem.CheckState", UpdateCheckState);
 }
 public CheckedListBoxItem( object tag, GetObjectStringDelegate getItemText, GetObjectCheckStateDelegate getItemCheckState, SetObjectCheckStateDelegate setItemCheckState )
 {
     _tag = tag;
     _getItemText = getItemText;
     _getItemCheckState = getItemCheckState;
     _setItemCheckState = setItemCheckState;
     _depText = Dependent.New("CheckedListBoxItem.Text", UpdateText );
     _depCheckState = Dependent.New("CheckedListBoxItem.CheckState", UpdateCheckState);
 }
        private void UpdateItems()
        {
            ++_updating;
            try
            {
                if ( GetItems != null )
                {
                    // Use the adapter if the check state event is not defined.
                    GetObjectCheckStateDelegate getItemCheckState = GetItemCheckState;
                    if ( getItemCheckState == null )
                        getItemCheckState = new GetObjectCheckStateDelegate( AdaptGetItemCheckState );
                    SetObjectCheckStateDelegate setItemCheckState = SetItemCheckState;
                    if ( setItemCheckState == null )
                        setItemCheckState = new SetObjectCheckStateDelegate( AdaptSetItemCheckState );

                    // Recycle the collection of items.
                    ArrayList newItems = new ArrayList( base.Items.Count );
                    using (var recycleBin = new RecycleBin<CheckedListBoxItem>())
                    {
                        foreach (CheckedListBoxItem item in base.Items)
                            recycleBin.AddObject(item);

                        // Extract each item from the recycle bin.
                        foreach ( object item in GetItems() )
                        {
                            newItems.Add( recycleBin.Extract(
                                new CheckedListBoxItem( item, GetItemText, getItemCheckState, setItemCheckState ) ) );
                        }
                    }

                    // Replace the items in the control.
                    base.BeginUpdate();
                    try
                    {
                        // Make sure the same tag is selected.
                        CheckedListBoxItem selectedItem = (CheckedListBoxItem)base.SelectedItem;
                        object selectedTag = selectedItem == null ? null : selectedItem.Tag;
                        base.Items.Clear();
                        base.Items.AddRange( newItems.ToArray() );
                        base.SelectedIndex = IndexOfTag( selectedTag );
                    }
                    finally
                    {
                        base.EndUpdate();
                    }
                }
            }
            finally
            {
                --_updating;
            }
        }