public void AddItems <TItem>(ComboBox control, Expression <Func <TDocument, TItem> > property, IEnumerable <TItem> items) where TItem : class
        {
            PropertyInfo             pi          = GetProperty(property);
            Func <TDocument, string> setProperty = (doc) =>
            {
                pi.SetValue(doc, (control.SelectedItem as TItem));
                return(pi.Name);
            };

            var func = property.Compile();
            Action <TDocument> setControl = (doc) =>
            {
                ComboBoxExtensions.SetItem(control, func.Invoke(doc));
            };

            AddItems(control, setProperty, setControl, items);
        }
        public void AddEnum <TEnum>(ComboBox control, Expression <Func <TDocument, TEnum> > property)
        {
            PropertyInfo             pi          = GetProperty(property);
            Func <TDocument, string> setProperty = (doc) =>
            {
                pi.SetValue(doc, (control.SelectedItem as ListItem <TEnum>).Value);
                return(pi.Name);
            };

            var func = property.Compile();
            Action <TDocument> setControl = (doc) =>
            {
                ComboBoxExtensions.SetValue(control, func.Invoke(doc));
            };

            AddEnum <TEnum>(control, setProperty, setControl);
        }
        /// <summary>
        /// Fills a combo box from TItem keys of a dictionary, mapping to corresponding TValues that are bound to the document
        /// </summary>
        public void AddItems <TValue, TItem>(ComboBox control, Expression <Func <TDocument, TValue> > property, Dictionary <TValue, TItem> itemDictionary) where TItem : class
        {
            var pi = GetProperty(property);
            Func <TDocument, string> setProperty = (doc) =>
            {
                var reverseDictionary = itemDictionary.ToDictionary(kp => kp.Value, kp => kp.Key);
                pi.SetValue(doc, reverseDictionary[control.GetItem <TItem>()]);
                return(pi.Name);
            };

            var func = property.Compile();
            Action <TDocument> setControl = (doc) =>
            {
                var value = func.Invoke(doc);
                ComboBoxExtensions.SetItem(control, itemDictionary[value]);
            };

            AddItems(control, setProperty, setControl, itemDictionary.Select(kp => kp.Value));
        }