将文本框绑定到 comboBox.SelectedItem 的属性

Posted

技术标签:

【中文标题】将文本框绑定到 comboBox.SelectedItem 的属性【英文标题】:Binding textboxes to properties of a comboBox.SelectedItem 【发布时间】:2011-01-13 15:16:27 【问题描述】:

我正在使用 winforms,并且我有一个代表 IQueryable 的组合框。组合框下方是一系列文本框,我想将它们绑定到当前从组合框中选择的文本框。

这是我的代码。

public partial class TestForm : Form

    public DataClassesDataContext DataContext;

    public IQueryable<T> datasource;

    // Ctor
    public TestForm()
    
    InitializeComponent();

    // L2S data context
    this.DataContext = new DataClassesDataContext();

    // Get the variable for the data source
    this.datasource = this.DataContext.Ts;

    // setup the binding for the combobox
    this.comboBox1.DataSource = this.datasource;
    this.comboBox1.DisplayMember = "Description";
    this.comboBox1.ValueMember = "Id";

    // assign the databindings of the text boxes to the selectedItem of the combo box    
    // this is where the problem is, afaik
    TId.DataBindings.Add(new Binding("Text", this.comboBox1.SelectedItem, "Id"));
    TUser.DataBindings.Add(new Binding("Text", this.comboBox1.SelectedItem, "User"));
    TDescription.DataBindings.Add(new Binding("Text", this.comboBox1.SelectedItem, "Description"));

这样做会绑定所有内容,当我更改文本框中的值时,它会很好地更新组合框中最初选择的项目。即使我更改了描述,它也会更新 drop don 中显示的文本,这一切都很棒。

但是,当我从下拉列表中选择其他项目时,文本框不会绑定到新选择的项目,它们会保持绑定到旧项目。

每次组合框上的选择更改时,我是否需要删除并重新添加我的绑定?

【问题讨论】:

【参考方案1】:

我最初的答案是错误的,诚然我并不完全理解这里发生的一切,但我有一个可行的解决方案。

基本上,您需要从BindingContext 中获取BindingManagerBase,并使用它对每个SelectedItemChanged 事件执行数据绑定。

public partial class TestForm : Form

    public DataClassesDataContext DataContext;

    public IQueryable<T> datasource;
    private BindingManagerBase bmComboBoxSelectedItem;

    // Ctor
    public TestForm()
    
        InitializeComponent();

        // L2S data context
        this.DataContext = new DataClassesDataContext();

        // Get the variable for the data source
        this.datasource = this.DataContext.Ts;

        // setup the binding for the combobox
        this.comboBox1.DataSource = this.datasource;
        this.comboBox1.DisplayMember = "Description";
        this.comboBox1.ValueMember = "Id";

        // assign the databindings of the text boxes to the selectedItem of the combo box    
        // this is where the problem is, afaik
        TId.DataBindings.Add(new Binding("Text", this.comboBox1, "SelectedItem.Id"));
        TUser.DataBindings.Add(new Binding("Text", this.comboBox1, "SelectedItem.User"));
        TDescription.DataBindings.Add(new Binding("Text", this.comboBox1, "SelectedItem.Description"));

        bmComboBoxSelectedItem = this.BindingContext[this.comboBox1, "SelectedItem"];
    

    // make sure you assign this event on the forms designer or your preferred method
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    
        bmCustomers.ResumeBinding();
    

这个MSDN article帮了很多忙。

【讨论】:

我收到此异常“在 DataSource 上找不到 DataMember 属性 'SelectedItem'。” 我还尝试绑定到一个成员变量并在下拉菜单中设置 onchange,我将该变量重新分配给当前选定的变量。这也导致了我最初的问题。所以,我不认为这是我需要的解决方案 希望这些更改能帮助您入门。我真的还没有完全理解它,但这是我通过使用它并使用链接的 MSDN 文章想出的。 太棒了,我肯定会在星期一跟进,现在+1,再次感谢 好的,所以我学会了添加数据源并让设计人员为您连接所有数据绑定。我会贴一些设计师为你写的代码。【参考方案2】:

使用BindingSource 而不是直接依赖 L2S 数据上下文。绑定源使用并发管理器为您处理所有更新,而 L2S 不会

工作代码:

public partial class TestForm : Form

    public DataClassesDataContext DataContext;

    // Incorrect: public IQueryable<T> datasource;
    // Correct:
    public BindingSource TsDataSource;

    // Ctor
    public TestForm()
    
    InitializeComponent();

    // L2S data context
    this.DataContext = new DataClassesDataContext();

    // Get the variable for the data source
    // Incorrect: this.datasource = this.DataContext.Ts;
    // Correct:
    this.TsDataSource = new BindingSource();
    this.TsDataSource.DataSource = this.DataContext.Ts;

    // setup the binding for the combobox
    this.comboBox1.DataSource = this.TsDataSource;
    this.comboBox1.DisplayMember = "Description";
    this.comboBox1.ValueMember = "Id";

    // assign the databindings of the text boxes to the selectedItem of the combo box    
    TId.DataBindings.Add(new Binding("Text", this.TsDataSource, "Id"));
    TUser.DataBindings.Add(new Binding("Text", this.TsDataSource, "User"));
    TDescription.DataBindings.Add(new Binding("Text", this.TsDataSource, "Description"));

更多关于来自source的BindingSource(无法抗拒):

BindingSource 组件服务于 许多目的。首先,它简化了 将表单上的控件绑定到数据 提供货币管理、找零 通知和其他服务 Windows 窗体控件和 数据源。这是通过 附加 BindingSource 组件 使用 数据源属性。对于复杂的 您可以选择绑定场景 将 DataMember 属性设置为 数据中的特定列或列表 资源。然后将控件绑定到 绑定源。所有进一步的互动 与数据完成 调用 BindingSource 组件。 有关如何使用 BindingSource 的示例 可以简化绑定过程,见 如何:将 Windows 窗体控件绑定到 DBNull 数据库值以及如何: 处理错误和异常 与数据绑定一起发生。导航和 数据源的更新是 通过方法如 MoveNext、MoveLast 和 Remove。 排序等操作 过滤是通过排序处理的 和过滤器属性。更多 有关使用排序和 使用 BindingSource 进行过滤,请参阅 如何:对 ADO.NET 数据进行排序和筛选 使用 Windows 窗体 BindingSource 组件。

【讨论】:

以上是关于将文本框绑定到 comboBox.SelectedItem 的属性的主要内容,如果未能解决你的问题,请参考以下文章

将多行绑定到文本框以进行编辑+更新

XAML:将文本框最大长度绑定到类常量

如何将文本框绑定到 XML 文件(带有命名空间)

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?

如何将 ObservableCollection 绑定到 DataTemplate 中的文本框?

如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?