Windows Forms: Nullable ComboBox

Auf der Suche nach einer Möglichkeit, einer ComboBox zusätzlich zu den eigentlichen Werten auch einen Eintrag für einen Nullwert zu spendieren habe ich schlussendlich folgende Umsetzung gewählt, die bisher ganz gut funktioniert. Wenn jemand Schwachstellen findet darf er sich gerne in den Kommentaren auslassen:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Reflection;

namespace com.boobe.salesman.ui.Controls
{
    public class NullableComboBox : ComboBox
    {
        public string NullLabel { get; set; }
        public object NullValue { get; set; }

        private string _displayMember;
        public new string DisplayMember
        {
            get { return _displayMember; }
            set { _displayMember = value; }
        }

        public NullableComboBox()
        {
            NullLabel = "";
            NullValue = null;

            base.ValueMember = "Entity";
            base.DisplayMember = "Title";
        }

        private object _dataSource;
        private IList _items;
        new public object DataSource
        {
            get { return _dataSource; }
            set
            {
                if (value.GetType().IsAssignableFrom(typeof(IEnumerable)))
                    throw new ArgumentException("Nur von IEnumerable abgeleitete Typen sind erlaubt.");

                if (_dataSource != null && _dataSource == value)
                    return;

                _dataSource = value;

                IEnumerable<object> list = (IEnumerable<object>)value;

                _items = new List();
                foreach (object current in list)
                {
                    PropertyInfo propertyInfo = current.GetType().GetProperty(DisplayMember);
                    string title = propertyInfo != null ? propertyInfo.GetValue(current, null).ToString() : current.ToString();
                    _items.Add(new NullableComboBoxItem { Title = title, Entity = current });
                }
                _items.Insert(0, new NullableComboBoxItem { Title = NullLabel, Entity = NullValue });

                base.DataSource = _items;
            }
        }

        new public object SelectedItem
        {
            get
            {
                NullableComboBoxItem selectedItem = (NullableComboBoxItem)base.SelectedItem;
                return selectedItem == null ? null : selectedItem.Entity;
            }
            set
            {
                foreach (NullableComboBoxItem cur in _items)
                {
                    if (cur.Entity == value)
                        base.SelectedItem = cur;
                }
            }
        }

        private class NullableComboBoxItem
        {
            public string Title { get; set; }
            public object Entity { get; set; }
        }
    }
}

Verwendet wird die ComboBox wie folgt:

colorComboBox.NullLabel = "";
colorComboBox.NullValue = null;
colorComboBox.DisplayMember = "ColorName";
colorComboBox.DataSource = context.ProductColors.Where(x => x.Discontinued == false);

About this entry