У меня есть два ObservableCollection
с именами BuyOrders
и SellOrders
. Если я удаляю элементы из одного из них следующим образом:
var list = order.OrderType == OrderType.Buy ? BuyOrders : SellOrders;
var o = list.Where(x => x.OrderNo == order.OrderNo).First();
list.Remove(o);
ObservableCollection.CollectionChanged
событие работает. Однако, если я обновлю элемент, подобный этому:
var list = order.OrderType == OrderType.Buy ? BuyOrders : SellOrders;
var o = list.Where(x => x.OrderNo == order.OrderNo).First();
o.Price = order.Price;
o.Quantity = order.Quantity;
CollectionChanged
событие не будет работать! Разве это не действительный Reset
?
Что-то не так в моем коде?
РЕДАКТИРОВАТЬ
Это обработчик для BuyOrders
:
void BuyChanged(object sender, NotifyCollectionChangedEventArgs e)
{
AllOrder order = null;
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
try { order = e.NewItems[0] as AllOrder; }
catch (Exception) { return; }
if (order.ItemCode == ItemCode) Buys = GetOrders(ClientCode.BuyOrders).OrderByDescending(x => x.Price);
break;
case NotifyCollectionChangedAction.Remove:
case NotifyCollectionChangedAction.Reset:
Buys = GetOrders(ClientCode.BuyOrders).OrderByDescending(x => x.Price);
break;
}
}
У меня есть аналогичный обработчик для SellOrders
Используемый ObservableCollection
назван AsyncObsetion
и реализован следующим образом:
public class AsyncObsetion<T> : ObservableCollection<T>
{
private SynchronizationContext context = SynchronizationContext.Current;
public AsyncObsetion() { }
public AsyncObsetion(IEnumerable<T> list) : base(list) { }
void RaiseCollectionChanged(object param) => base.OnCollectionChanged((NotifyCollectionChangedEventArgs)param);
void RaisePropertyChanged(object param) => base.OnPropertyChanged((PropertyChangedEventArgs)param);
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (SynchronizationContext.Current == context) RaiseCollectionChanged(e);
else context.Send(RaiseCollectionChanged, e);
}
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (SynchronizationContext.Current == context) RaisePropertyChanged(e);
else context.Send(RaisePropertyChanged, e);
}
}
дляизбавиться от App.Current.Dispatcher.Invoke
.