ItemPropertyChanged无法处理observableCollection.Why?

我已经搜索了高低的解决方案,但我似乎没有找到它的底部。 像网上的很多post我似乎没有让我的itemPropertyChanged工作。 编辑集合中的项目时不会触发。为什么。

有点长,但这是我放在一起的一个例子。

我有一个customerViewModel,它包含一个OrderViewModel集合,当编辑datagrid中的事件不会触发时。

我已经实现了以下function,但只在加载时才会被解雇。 好像它不是同一个东西的集合……

INotifyPropertyChanged inpc = OrderViewModels; inpc.PropertyChanged += OnItemPropertyChanged; 

有什么建议吗?这让我很生气

楷模

 public class Order { public int Id { get; set; } public string Description { get; set; } public int CustomerId{ get; set; } } public class Customer { public Customer() { Orders=new ObservableCollection(); } public int Id { get; set; } public string Name { get; set; } public string Surname{ get; set;} public ObservableCollection Orders{ get; set;} } 

的ViewModels

 public class CustomerViewModel : ViewModelBase { private Customer _customerModel; public CustomerViewModel(Customer customerModel) { _customerModel = customerModel; _orderViewModels = new ObservableCollection(); OrderViewModels.CollectionChanged += OnOrdersCollectionChanged; INotifyPropertyChanged inpc = OrderViewModels; inpc.PropertyChanged += OnItemPropertyChanged; } private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e) { //not firing!!!!!!!!!!!!!!!!!!!!!!!!! } void OnOrdersCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: _customerModel.Orders.Insert(e.NewStartingIndex, ((OrderViewModel)e.NewItems[0]).OrderModel); break; case NotifyCollectionChangedAction.Remove: _customerModel.Orders.RemoveAt(e.OldStartingIndex); break; case NotifyCollectionChangedAction.Replace: _customerModel.Orders[e.OldStartingIndex] = ((OrderViewModel)e.NewItems[0]).OrderModel; break; case NotifyCollectionChangedAction.Move: _customerModel.Orders.Move(e.OldStartingIndex, e.NewStartingIndex); break; default: throw new ArgumentOutOfRangeException(); } } public int Id { get { return _customerModel.Id; } set { _customerModel.Id = value; OnPropertyChanged("Id"); } } public string Name { get { return _customerModel.Name; } set { _customerModel.Name = value; OnPropertyChanged("Name"); } } public string Surname { get { return _customerModel.Surname; } set { _customerModel.Surname = value; OnPropertyChanged("Surname"); } } public Customer CustomerModel { get { return _customerModel; } set { _customerModel = value; OnPropertyChanged(""); } } private ObservableCollection _orderViewModels; public ObservableCollection OrderViewModels { get { return _orderViewModels; } set { _orderViewModels = value; OnPropertyChanged("OrderViewModels"); } } } public class OrderViewModel:ViewModelBase { private Order _orderModel; public OrderViewModel(Order orderModel) { _orderModel = orderModel; } public int Id { get { return _orderModel.Id; } set { _orderModel.Id = value; OnPropertyChanged("Id"); } } public int CustomerId { get { return _orderModel.CustomerId; } set { _orderModel.CustomerId = value; OnPropertyChanged("CustomerId"); } } public string Description { get { return _orderModel.Description; } set { _orderModel.Description = value; OnPropertyChanged("Description"); } } public Order OrderModel { get { return _orderModel; } set { _orderModel = value; OnPropertyChanged(""); } } } 

知识库

 public class OrderRepository { public static ObservableCollection GetOrders(int customerId) { return new ObservableCollection { new Order {Id = 1, CustomerId=1, Description = "MotherBoard"}, new Order {Id = 2, CustomerId=1,Description = "Video Card"}, new Order {Id = 3, CustomerId=1,Description = "TV"}, new Order {Id = 4, CustomerId=1, Description = "Video Recorder"}, new Order {Id = 5, CustomerId=1,Description = "Speakers"}, new Order {Id = 6, CustomerId=1,Description = "Computer"} }; } } 

视图

 public partial class OrdersView { public OrdersView() { InitializeComponent(); if (!DesignerProperties.GetIsInDesignMode(this)) { var customerVm = new CustomerViewModel(new Customer { Id = 1, Name = "Jo", Surname = "Bloggs" }); var orders = OrderRepository.GetOrders(1); foreach (var orderModel in orders) { customerVm.OrderViewModels.Add(new OrderViewModel(orderModel)); } DataContext = customerVm; } } } 

XAML

          

  INotifyPropertyChanged inpc = OrderViewModels; inpc.PropertyChanged += OnItemPropertyChanged; 

ObservableCollection上的任何属性发生更改时,该代码将通知您, 而不是当ObservableCollection中的项更改其属性时 。 例如,在添加或删除OrderViewModel时应调用您的处理程序,因为Count属性将在ObservableCollection上更改。

没有什么能在OrderViewModel传播PropertyChanged事件并将它们聚合成一个单独的事件。 当我想这样做时,我使用一个名为ItemObservableCollection的类:

 public sealed class ItemObservableCollection : ObservableCollection where T : INotifyPropertyChanged { public event EventHandler> ItemPropertyChanged; protected override void InsertItem(int index, T item) { base.InsertItem(index, item); item.PropertyChanged += item_PropertyChanged; } protected override void RemoveItem(int index) { var item= this[index]; base.RemoveItem(index); item.PropertyChanged -= item_PropertyChanged; } protected override void ClearItems() { foreach (var item in this) { item.PropertyChanged -= item_PropertyChanged; } base.ClearItems(); } protected override void SetItem(int index, T item) { var oldItem = this[index]; oldItem.PropertyChanged -= item_PropertyChanged; base.SetItem(index, item); item.PropertyChanged += item_PropertyChanged; } private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { OnItemPropertyChanged((T)sender, e.PropertyName); } private void OnItemPropertyChanged(T item, string propertyName) { var handler = this.ItemPropertyChanged; if (handler != null) { handler(this, new ItemPropertyChangedEventArgs(item, propertyName)); } } } public sealed class ItemPropertyChangedEventArgs : EventArgs { private readonly T _item; private readonly string _propertyName; public ItemPropertyChangedEventArgs(T item, string propertyName) { _item = item; _propertyName = propertyName; } public T Item { get { return _item; } } public string PropertyName { get { return _propertyName; } } } 

我可以像这样使用它:

 var orders = new ItemObservableCollection(); orders.CollectionChanged += OnOrdersChanged; orders.ItemPropertyChanged += OnOrderChanged; 

System.ComponentModel.BindingList提供与ObservableCollection相同的functionnality,并正确处理PropertyChanged事件。

最好的祝福