ListControl.DataSource 在 ToolStipControlHost 中不起作用

ListControl.DataSource in ToolStipControlHost not function

我使用 ToolStripControlHost 包装一个 ListBox 控件以将其添加到 ToolStripDropDown 中,但发现我分配给 ListBox.DataSource 的项目没有显示,而且 ComboBox.DataSource 也不起作用,我不知道不明白为什么 ListContorl.DataSource 在 ToolStripControlHost 中不起作用。

        ListBox listBox = new ListBox();
        listBox.DataSource = new string[] { "1", "2", "3" };

        ToolStripControlHost host = new ToolStripControlHost(listBox)
        {
            Margin = Padding.Empty,
            Padding = Padding.Empty,
            AutoSize = false
        };

        ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = false };
        dropDown.Items.Add(host);
        dropDown.Show();

编辑

我发现问题是 ToolStripDropDown 没有父级提供 BindingContext,所以它会发生在任何带有 DataManager 的控件上。

好问题。似乎必须将 ListBox 添加到顶级控件(例如 Form)才能强制其使用 DataSource 属性。例如。在分配 DataSource 后添加此代码:

public class DataForm : Form {

    ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = true };
    ListBox listBox = new ListBox();
    public DataForm() {
        listBox.DataSource = new string[] { "1", "2", "3" };
        var hWnd = listBox.Handle; // required to force handle creation
        using (var f = new Form()) {
            f.Controls.Add(listBox);
            f.Controls.Remove(listBox);
        }

        ToolStripControlHost host = new ToolStripControlHost(listBox) {
            Margin = Padding.Empty,
            Padding = Padding.Empty,
            AutoSize = false
        };

        dropDown.Items.Add(host);
    }

    protected override void OnMouseClick(MouseEventArgs e) {
        base.OnMouseClick(e);
        dropDown.Show(Cursor.Position);
    }
}

您还可以查看 ListBox.cs 源代码以尝试找出根本原因:http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ListBox.cs,03c7f20ed985c1fc

我发现问题是 ToolStripDropDown 没有父级提供 BindingContext,所以解决方案是分配 Form 的 BindingContext。

        ListBox listBox = new ListBox();
        listBox.DataSource = new string[] { "1", "2", "3" };
        listBox.BindingContext = this.BindingContext; //assign a BindingContext

        ToolStripControlHost host = new ToolStripControlHost(listBox)
        {
            Margin = Padding.Empty,
            Padding = Padding.Empty,
            AutoSize = false
        };

        ToolStripDropDown dropDown = new ToolStripDropDown() { AutoClose = false };
        dropDown.Items.Add(host);
        dropDown.Show();