我正在尝试将 ListBox 的 SelectedItem 数据绑定到属性。以下代码是一个示例:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace BindingFailure
{
static class Program
{
class OuterObject
{
public string selected { get; set; }
public List<string> strings { get; set; }
}
public static void Main()
{
List<OuterObject> objs = new List<OuterObject>()
{
new OuterObject(), new OuterObject()
};
objs[0].strings = new List<string> { "one", "two", "three" };
objs[1].strings = new List<string> { "four", "five", "six" };
Form form = new Form();
BindingSource obs = new BindingSource(objs, null),
ibs = new BindingSource(obs, "strings");
BindingNavigator nav = new BindingNavigator(obs);
ListBox lbox = new ListBox();
lbox.DataSource = ibs;
lbox.DataBindings.Add(new Binding("SelectedItem", obs, "selected"));
form.Controls.Add(nav);
form.Controls.Add(lbox);
lbox.Location = new System.Drawing.Point(30, 30);
Application.Run(form);
}
}
}
如果您只是选择一个项目,向前移动,选择一个项目然后退出,它会按预期工作。但是,如果您使用导航器在两个外部对象之间来回切换,则所选项目似乎被错误的值覆盖。似乎每次 BindingNavigator 移动到元素时,ListBox 都会被告知移动到其集合中的第一项,从而覆盖绑定到其 SelectedItem 的变量中的任何值。
关于如何解决这个问题的想法?提前致谢。
编辑:这是示例项目的存档,包括调试二进制文件。
http://www.mediafire.com/?dzmqmz0mynj
编辑:这是基于接受的答案的辅助函数:
public static void Bind(ListControl list, BindingSource outersource, string dataMember)
{
Binding bindSel = new Binding("SelectedItem", outersource, dataMember);
list.DataBindings.Add(bindSel);
outersource.CurrentChanged += delegate
{
list.BeginInvoke(new MethodInvoker(bindSel.ReadValue));
};
}