【问题标题】:Modifying original DataSource doesn't update ComboBox修改原始 DataSource 不会更新 ComboBox
【发布时间】:2018-09-15 19:31:35
【问题描述】:

我有一个ComboBox 和一个DataSource 设置为应用程序设置,如下所示

public DetailsForm()
{
    InitializeComponent();
    this.comboBox1.DataSource = TextSelectionSettings.Default.categories;
}

但如果用户在运行时需要,我希望用户在组合框中添加额外的项目。所以我只是在一个文本框上做了一个简单的点击事件来测试向列表中添加一个新字符串。

private void textBox1_MouseClick(object sender, MouseEventArgs e)
{
    TextSelectionSettings.Default.categories.Add("test");
    TextSelectionSettings.Default.Save();
}

但是ComboBox 没有显示我添加到设置中的新字符串。

如何刷新ComboBox 以显示设置的更改?

  • 组合框上的Refresh() 功能不起作用。
  • 再次设置 DataSource 也不起作用。
  • 我无法使用Items.Add() 方法将Item 直接添加到ComboBox,因为设置了DataSource

【问题讨论】:

  • 为了让它接受更改,它必须实现 INotifyPropertyChangedINotifyCollectionChanged。尝试设置DataSource = null,然后重新设置。
  • @RonBeyer 将 DataSource 设置为 null 然后再次返回到工作类别,谢谢

标签: c# winforms


【解决方案1】:

为了使 Windows 窗体(和 WPF)中的数据绑定能够正常工作,它必须具有某种更改通知,例如 IBindingListINotifyCollectionChanged 才能注意到更改。

  • 调用Refresh() 只是为了绘画,不会刷新绑定
  • .DataSource 设置为相同的值将不起作用(您不会更改任何内容,因此不会将其视为更改)

解决方法是将.DataSource 设置为null,然后再次将其设置回集合。这会导致它重新评估绑定(因为它与当前的 null 对象不同)并重置您的值。

【讨论】:

  • INotifyPropertyChanged 与问题完全无关。此问题的相关接口(接收ListChanged 通知)为IBindingLust,如linked post 中所述。
  • @RezaAghaei 我删除了它,虽然对于其他数据绑定INotifyPropertyChanged 将与数据绑定(如文本框)相关,但是是的,在这种情况下不相关。
猜你喜欢
  • 2011-11-14
  • 2015-11-12
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多