【问题标题】:Update Listbox when using ObservableCollection使用 ObservableCollection 时更新列表框
【发布时间】:2015-06-11 14:07:50
【问题描述】:

我有一个 ObservableCollection 绑定到这样的列表框:

string[] selection = comboEmail.GetItemText(comboEmail.SelectedItem).Split(',');

Employee add = new Employee(Convert.ToInt32(selection[0]), selection[1], selection[2], selection[3]);
displayEmp.Add(add);
listEmail.DataSource = displayEmp;

它将数据添加到列表框(listEmail),但是,删除后如何更新它。这是我迄今为止尝试过的:

int indexRemoval = listEmail.SelectedIndex;
displayEmp.RemoveAt(indexRemoval);
listEmail.DataSource = displayEmp;
//listEmail.Refresh();

但它不起作用。用户单击删除按钮后如何更新列表?

【问题讨论】:

  • 您对 MVVM 的处理方式有一些问题...一旦绑定,ObservableCollection 就不需要手动刷新了。您的按钮也应该绑定到命令,删除应该使用listEmail.SelectedItem。此外,绑定应该在 XAML 中进行,而不是在代码隐藏中(我没有经验,所以我无法帮助你)。这个想法是让逻辑完全脱离 UI。
  • @Kilazu - 谢谢,我坚持使用常规 List 集合。
  • 你为什么要这样做?
  • 我没有使用 ObservableCollection 的经验,这是在另一篇文章中向我建议的。我以前使用 List 集合,它正在工作。我会坚持下去。除了更多的代码行之外,还有什么理由我不应该使用 List?
  • 你来自 Winforms,对吧?我去过那里,去 MVVM WPF 是一个相当复杂的步骤。如果您需要快速运行的东西,请适合自己并使用列表;但最终,如果你想继续使用 WPF,你应该学习 MVVM、绑定等。至于原因,这不仅仅是关于一个列表,而是关于您将在程序中使用的所有内容。如果它很短,不要理会 MVVM;如果您将来需要可维护的东西,那就是 MVVM。

标签: c# winforms collections listbox


【解决方案1】:

您需要设置ItemSource 而不是DataSource。这假设您还设置了DataContext

listEmail.ItemSource = displayEmp;

由于您已将 displayEmp 定义为 ObservableCollection,因此您的更新应该会自动反映。

编辑: 这是一个使用 BindingList 自动刷新 UI 的示例供您参考:

public BindingList<Data> DataList { get; set; }

public void Load()
{
    DataList = new BindingList<Data>
                   {
                        new Data
                            {
                                Key = "Key1",
                                Value = "Value1"
                            },
                        new Data
                            {
                                Key = "Key2",
                                Value = "Value2"
                            },
                        new Data
                            {
                                Key = "Key3",
                                Value = "Value3"
                            }
                    };
     listBox1.DataSource = DataList;
     listBox1.DisplayMember = "Value";
     listBox1.ValueMember = "Key";
}

public class Data
{
     public string Key { get; set; }
     public string Value { get; set; }
}   

private void button1_Click(object sender, EventArgs e)
{
    DataList.RemoveAt(1);
}

【讨论】:

  • 如何正确移除一个项目?您能否更新您的代码以显示如何进行删除?
  • 我正在构建一个 WinForm 应用程序,但 ListBox 下的 ItemSource 对我不可用。
  • ItemsSource 似乎只是 WPF。 Try with a BindingList。 (编辑:你知道 Winforms 有多么痛苦;p)
  • @Kilazu - 感谢您的建议和链接:D
  • 既然你提到了 ObservableCollection,我以为你正在使用 WPF。就像@Kilazur 提到的 BindingList 非常适合您。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多