, Универсальный просто означает, что вы можете использовать эту вещь в гораздо большем количестве мест, чем 1, включая будущий проект.
м приложении WPF у меня есть ItemsControl, значения элементов которого зависят от предыдущего элементаотображается.
ViewModel - это аудиофайл, разбитый на части переменной длины, и мне нужно отобразить его таким образом, с датой DateTime, отображаемой справа, и это то, что мне нужно рассчитать (я знаю только длину каждой части, мне нужно вычислить фактическое время начала и окончания, а также позиция в ItemsControl).
--
----
------------
--
--------------------
Мой первый подход состоял в том, чтобы использоватьObservableCollection<MyviewModel>
но вскоре произошли ужасы
5-полосное мультисвязывание, в которомIMultiValueConverter
Я бы рассчитал возвращаемое значение и установил бы свойство DataContext на это значение, потому что я знал только предыдущий элемент во время выполнения.
Предыдущий элемент был отправлен с использованием привязкиRelativesource.PreviousData
.
Теперь моя проблема заключается в том, что после установки значения из Конвертера (что, очевидно, является плохой вещью) и фактического запуска его в работу, обычная Коллекция не имеет понятия порядка в своих элементах, поэтому, когда дальше Я хочу добавить аудио часть в середине остальных, дисплей испорчен.
Кроме того, когда я реализую больше бизнес-логики, мне может понадобиться получить доступ к началу и концу аудио частей, которые рассчитаны в этом конвертере, и что, если они еще не отображаются ...?
Так что этот подход был неправильным на нескольких уровнях.
Вот где я начал гуглить и узнал оLinkedList
, Теперь я пытаюсь создать класс, который по сути является Observable LinkedList (мне не нужно, чтобы он был универсальным):
public class ObservableSegmentLinkedList : LinkedList<MyViewModel>, INotifyCollectionChanged
{
//Overrides ???
#region INotifyCollectionChanged Members
public event NotifyCollectionChangedEventHandler CollectionChanged;
public void OnNotifyCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (CollectionChanged != null)
{
CollectionChanged(this, e);
}
}
#endregion
}
И суть проблемы в том, что я не могу переопределить методы, которые изменяют коллекцию (Addfirst, AddLast и т. Д.), Поэтому я не могу правильно вызвать OnNotifyCollectionChanged ...
Так что я думаю, что могу сделать перегрузки для каждого из этих методов, но это звучит довольно неприятно ...
Вкратце: мне нужна какая-то коллекция, в которой каждый элемент знает детали предыдущего, чтобы вычислить одно из его собственных свойств.
Есть какие-нибудь подсказки? это даже хорошее решение?
Спасибо!
Приложение ViewModel выглядит так:
public class MyViewModel : INotifyPropertyChanged
{
private DateTime m_SegmentLength;
public DateTime SegmentLength
{
get { return m_SegmentLength; }
set
{
m_SegmentLength = value;
NotifyPropertyChanged("SegmentLength");
}
}
private DateTime m_SegmentAdvert;
public DateTime SegmentAdvert
{
get { return m_SegmentAdvert; }
set
{
m_SegmentAdvert = value;
NotifyPropertyChanged("SegmentAdvert");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String prop)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
РЕДАКТИРОВАТЬ: я думаю, что я попытаюсь объединить ответы Томаса и Уилла: я буду использовать композицию (т.е. я сохраню экземпляр LinkedList в своем пользовательском объекте вместо того, чтобы наследовать от него) и переопределю методы, которые должны использоваться (AddAfter, AddFirst и т.д.), в котором я просто вызову OnNotifyPropertychanged после вызова фактического метода LinkedList. Это немного работы, но я думаю, что не будет никакого элегантного решения моей проблемы ...