【问题标题】:Wpf - How to update or notify ObservableCollection in parent window when a new item is added in child windowWpf - 在子窗口中添加新项目时如何在父窗口中更新或通知 ObservableCollection
【发布时间】:2015-12-04 09:48:47
【问题描述】:

当我在子窗口中添加新产品时,我想更新 n 在父窗口中通知我现有的产品列表。我已将 Observable 集合订阅到 NotifyPropertyChanged,但列表仍未更新为新产品。我需要再次从数据库中获取整个产品列表以刷新它。

private ObservableCollection<Product>   _productsList;
public ObservableCollection<Product> ProductsList
{
       get {return _productsList ;}
        private set {
             _productsList = value;
         NotifyPropertyChanged("ProductsList");
      }
}


 public void AddNewProduct()
 {
        Window_NewProduct newProduct = new Window_NewProduct();
        newProduct.ShowDialog();
 }

请帮帮我。在此先感谢。

【问题讨论】:

  • 您仅在整个 ProductsList 属性发生更改时引发 NotifyPropertyChanged,而不是在您向该列表添加或删除元素时。所以我认为您需要为_productsList.CollectionChagned 事件注册一个事件处理程序,并从该事件处理程序调用NotifyPropertyChanged。但是我在 wpf 方面没有那么有经验,不知道应该如何调用 NotifyPropertyChanged 进行收藏,所以我不会将此作为答案发布。
  • 订阅CollectionChangedObservableCollection事件
  • 你能帮我一些关于 CollectionChanged 实现的代码

标签: c# wpf observablecollection inotifypropertychanged


【解决方案1】:

当您替换您的ObservableCollection 时,您的NotifyPropertyChanged 将被触发。您需要注册您的ProductsList 属性的CollectionChanged 事件。请参阅:MSDN

【讨论】:

    【解决方案2】:

    添加新产品do DB的逻辑在哪里? 在 Window_NewProduct 中?

    如果是这样,则将产品添加到数据库中,但不会添加到 ProductsList。这里的问题不是如何刷新 ProductsList 而是正确地将新项目添加到此列表中。您可以尝试从 Window_NewProduct 返回新添加的 Product 并将其添加到 ProductsList。因为它是 ObservableCollection,所以所有刷新都应该自动执行。

    这里有一些伪代码:

    public void AddNewProduct()
    {
        Window_NewProduct newProductWindow = new Window_NewProduct();
        if(newProductWindow.ShowDialog() == OK)
        {
             ProductsList.Add(newProductWindow.NewlyAddedProduct);
        }
    
    }
    

    更新 1:

    除非我们不知道 Window_NewProduct 的样子,否则很难为您提供解决方案。 但是,我可以假设您有类似的方法:

    void SaveProduct()
    {
      var product = new Product();
      Database.Save(product);
    }
    

    你可以这样:

    public Product NewlyAddedProduct{get;private set;} //public property of Window
    
    public void SaveProduct()
    {
      var product = new Product();
      Database.Save(product);
      NewlyAddedProduct = product;
    }
    

    【讨论】:

    • 该函数 AddNewProduct 在父窗口中,将产品添加到 db 的逻辑在子窗口中,即 Window_NewProduct.after 将新产品添加到子窗口中的数据库中。我想要父窗口中的产品列表窗口以更新新项目。
    • 我没有得到你提到的 NewlyAddedProduct 的东西
    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多