1

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

所以我有类似的东西:

    _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 中的元素,并在选择更改时更新。

4

1 回答 1

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(实体框架),你不能调用集合属性的设置器,所以我的实体目前看起来像这样:注意我是如何复制所有完全没有必要的列表更改操作的,但是我确实说过这只是第一次工作。

    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);
                    }
                }
            }                
        }
    }
}
于 2012-12-12T15:54:59.990 回答