Winforms绑定列表框中的SelectedItems

时间:2012-12-12 11:24:48

标签: winforms

使用标准列表框我想将它绑定到一组对象并更新绑定项集合以包括所选对象。

所以我有类似的东西:

    _pContext = new BindingSource();
_pContext.DataSource = _gpContext;
_pContext.DataMember = "ParentEntities";
_AllChildrenListBox.DataSource = _container.ChildEntities;
_AllChildrenListBox.DataBindings.Add("MySelectedItems", _pContext, "ChildEntities", false);

_allChildrenListBox是列表框。我创建了一个继承自ListBox的新列表框类型,因此我可以创建一个替代的SelectedItems属性,然后封装逻辑以设置/取消设置项目。

简而言之,问题是:在上面,ChildEntities是“ChildEntity”对象的集合。我的列表框包含所有可能的ChildEntity对象,我希望选择ChildEntities中的元素,并在选择更改时更新。

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。这一刻有点难看,但有效。我可以稍后改进它。

首先是绑定本身。

_AllChildrenListBox.DataBindings.Add("SelectedItems2", _pContext, "ChildEntities2", true);

这里的关键似乎是将格式参数设置为true。

接下来,我在SelectedItems2中需要一些可以完成我的脏工作的东西。这是一团糟,但有效。这是完整的课程:

    public class MyListBox : ListBox
{
    private IEnumerable<object> _original;

    public IEnumerable<object> SelectedItems2
    {
        get
        {
            return UpdateSet();
        }
        set
        {
            SelectItems(value);
        }
    }

    private IEnumerable<object> UpdateSet()
    {
        var listSource = _original as IListSource;
        IList list = null;
        if (listSource != null)
        {
            list = listSource.GetList();
        }
        var iList = _original as IList;
        if (list == null && iList != null)
        {
            list = iList;
        }
        if (list == null)
        {
            return _original;
        }

        foreach (var item in SelectedItems)
        {
            if (!list.Contains(item))
            {
                list.Add(item);
            }
        }
        foreach (var item in _original.ToList())
        {
            if (!SelectedItems.Contains(item))
            {
                list.Remove(item);
            }
        }

        return _original;

    }

    private void SelectItems(IEnumerable<object> items)
    {
        _original = items;
        var hashset = new HashSet<object>();
        foreach (var item in items)
        {
            hashset.Add(item);
        }
        for(var i=0;i<Items.Count;i++)
        {
            SetSelected(i, hashset.Contains(Items[i]));
        }
    }
}

基本上我打破了所有规则并假设IEnumerable隐藏了一个更好吃的基于列表的界面,如果它确实使用它来更改底层集。

最后,我正在使用EF(实体框架)并且您无法调用集合属性的setter,因此我的实体当前看起来像这样:请注意我是如何复制所有列表更改操作的,这是完全没有必要的,但我确实说这只是第一次工作。

    public partial class ParentEntity
{
    public IEnumerable<object> ChildEntities2
    {
        get
        {
            return new List<object>(ChildEntities);
        }
        set
        {
            if (value == null)
            {
                return;
            }
            foreach (var item in ChildEntities.ToList().Where(item => !value.Contains(item)))
            {
                ChildEntities.Remove(item);
            }

            foreach (var item in value)
            {
                var cItem = item as ChildEntity;
                if (cItem != null)
                {
                    if (!ChildEntities.Contains(item as ChildEntity))
                    {
                        ChildEntities.Add(item as ChildEntity);
                    }
                }
            }                
        }
    }
}