【问题标题】:Problem with refreshing a ListView when I add an item from an other window (ObservableCollection)当我从其他窗口添加项目时刷新 ListView 的问题(ObservableCollection)
【发布时间】:2020-12-11 11:29:07
【问题描述】:

我从另一个窗口向我的 ListView 添加项目时遇到问题,它没有添加到列表中。 我正在尝试从窗口 WindowTodAddANewBus 向我的 MainWindow 中的 ListView 添加一个项目,当我添加它时,我希望 MainWindow 自动刷新。

使用 ObservableCollection 在 MainWindow.xaml.cs 中定义我的列表

public static List<Bus> buses = new List<Bus>();
public static ObservableCollection<Bus> myCollection { get; set; } = new ObservableCollection<Bus>(buses);

在构造函数中:

public MainWindow()
       {
           InitializeComponent();
           myListView.ItemsSource = buses;
       }

当我在 WindowToAddANewBus.xaml.cs 中添加新项目时

Bus b1 = new Bus(myLicenseNum, date);
MainWindow.myCollection.Add(b1);

不知道 ObservableCollection 用得好不好..

如果你能帮助我,请! 谢谢

【问题讨论】:

  • 这是对您的代码示例的一般建议,但您应该考虑使用 MvvmLight 之类的东西并绑定到模型,而不是在后面的代码中设置东西,从长远来看,这会使事情变得更容易。

标签: c# wpf listview observablecollection


【解决方案1】:

您需要将ItemsSource 设置为myCollection 属性,而不是buses。

要添加一些上下文,ObservableCollection 不会不通知您传递给构造函数的集合的更改,这只是在创建集合时将大量项目放入集合中的一种方法。但是,它会在其基础集合更改时通知更改(例如Add、Remove、Clear 等)。鉴于此,我认为您甚至根本不需要 buses 属性,您只需使用您的 myCollection 属性即可。

基本上将您的构造函数更改为:

public MainWindow()
{
    InitializeComponent();
    myListView.ItemsSource = myCollection;
}

一般方法的可能改进

为了更进一步,您可能希望完全避免使用static 属性,因为这些部分肯定会变得有些混乱。我建议您在创建/显示时查看将您的myCollection 属性传递给WindowToAddANewBus,或者最好让WindowToAddANewBus 类在关闭时返回Bus。

【讨论】:

  • 好的,谢谢!!但是我如何将 ObservalCollection 转换为 List 类型,因为我有这个函数接收一个 List 来用 10 个总线初始化我的列表,或者我必须执行一个新函数 InitializeBus(ObservableCollection myCollection) ?
  • @Elish 您可能只需将函数中的类型更改为 IEnumerable&lt;Bus&gt; 而不是 List&lt;Bus&gt; 尽管如果没有看到函数就很难确定
猜你喜欢
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多