C# Winforms绑定到ListBox

C# Winforms绑定到ListBox,c#,winforms,binding,C#,Winforms,Binding,我有一个带有列表框的Windows窗体。表单具有此方法 public void SetBinding(BindingList<string> _messages) { BindingList<string> toBind = new BindingList<string>( _messages ); lbMessages.DataSource = toBind; } 我还需要做什么才能在管理者中发表如下声明: Messages.Add("blah b

我有一个带有列表框的Windows窗体。表单具有此方法

public void SetBinding(BindingList<string> _messages)
{
  BindingList<string> toBind = new BindingList<string>( _messages );
  lbMessages.DataSource = toBind;
}
我还需要做什么才能在管理者中发表如下声明:

Messages.Add("blah blah blah...");
是否会导致在表单的列表框中立即添加并显示一行


我根本不必这样做。我只希望我的Manager类能够在表单执行其工作时发布到表单。

我认为问题在于您的SetBinding方法,您正在创建一个新的绑定列表,这意味着您不再绑定到Manager对象中的列表

尝试将当前BindingList传递到数据源:

public void SetBinding(BindingList<string> messages)
{
  // BindingList<string> toBind = new BindingList<string>(messages);
  lbMessages.DataSource = messages;
}

我认为问题在于你的SetBinding方法,你正在创建一个新的绑定列表,这意味着你不再绑定到Manager对象中的列表

尝试将当前BindingList传递到数据源:

public void SetBinding(BindingList<string> messages)
{
  // BindingList<string> toBind = new BindingList<string>(messages);
  lbMessages.DataSource = messages;
}

添加一个新的Winforms项目。放下一个列表框。请原谅我的设计。只是想说明它可以通过使用BindingSource和BindingList组合实现您想要的效果

使用BindingSource是这里的关键

经理级


添加一个新的Winforms项目。放下一个列表框。请原谅我的设计。只是想说明它可以通过使用BindingSource和BindingList组合实现您想要的效果

使用BindingSource是这里的关键

经理级


我试过了,但是管理器中的Messages.Add语句不更新lbMessages.DataSource;“计数从不从0开始移动。@KellyCline我试图尽可能地模拟您的代码,当我在Manager类上弹出消息时,列表框会自动显示新消息。确保引用的是同一个管理器类。否则,您可能必须使用更多信息更新您的帖子。我尝试过这样做,但Manager中的Messages.Add语句不会更新lbMessages.DataSource;“计数从不从0开始移动。@KellyCline我试图尽可能地模拟您的代码,当我在Manager类上弹出消息时,列表框会自动显示新消息。确保引用的是同一个管理器类。否则,您可能需要更新您的帖子,提供更多信息。另一条评论提供了修复方法,但我也想尝试一下。谢谢典型的解决方案程序员将使用提供数据绑定功能的类,例如**BindingSource**,而不是直接使用BindingList。阅读备注部分-另一个备注提供了修复,但我也想尝试一下。谢谢典型的解决方案程序员将使用提供数据绑定功能的类,例如**BindingSource**,而不是直接使用BindingList。阅读备注部分-
Messages.Add("blah blah blah...");
public void SetBinding(BindingList<string> messages)
{
  // BindingList<string> toBind = new BindingList<string>(messages);
  lbMessages.DataSource = messages;
}
public class Manager
{
    /// <summary>
    /// BindingList<T> fires ListChanged event when a new item is added to the list. 
    /// Since BindingSource hooks on to the ListChanged event of BindingList<T> it also is
    /// “aware” of these changes and so the BindingSource fires the ListChanged event. 
    /// This will cause the new row to appear instantly in the List, DataGridView or make any
    /// controls listening to the BindingSource “aware” about this change.
    /// </summary>
    public  BindingList<string> Messages { get; set; }
    private BindingSource _bs;

    private Form1 _form;

    public Manager(Form1 form)
    { 
        // note that Manager initialised with a set of 3 values
        Messages = new BindingList<string> {"2", "3", "4"};

        // initialise the bindingsource with the List - THIS IS THE KEY  
        _bs = new BindingSource {DataSource = Messages};
        _form = form;
    }

    public void UpdateList()
    {
         // pass the BindingSource and NOT the LIST
        _form.SetBinding(_bs);
    }
}
   public Form1()
    {
        mgr = new Manager(this);
        InitializeComponent();

        mgr.UpdateList();
    }

    public void SetBinding(BindingSource _messages)
    {
        lbMessages.DataSource = _messages;

        // NOTE that message is added later & will instantly appear on ListBox
        mgr.Messages.Add("I am added later");
        mgr.Messages.Add("blah, blah, blah");
    }