В моем приложении WPF у меня есть ItemsControl, значения элементов которого зависят от предыдущего элемента , отображаемого .
ViewModel - это аудиофайл, разбитый на части переменной длины, и мне нужно отобразить его таким образом, с DateTime, отображаемым справа, и это то, что мне нужно рассчитать (я знаю только каждую частьдлина, мне нужно вычислить фактическое время, когда он начинается и заканчивается, и позицию в ItemsControl).
--
----
------------
--
--------------------
Мой первый подход заключался в использовании ObservableCollection<MyviewModel>
, но вскоре произошли некоторые ужасы:
5-стороннее мультисвязывание, в котором IMultiValueConverter
я бы рассчитал возвращаемое значение и установил бы свойство DataContext на это значение, потому что я знал только предыдущий элемент во время выполнения.
Предыдущийэлемент был отправлен с помощью привязки на Relativesource.PreviousData
.
Теперь моя проблема заключается в том, что после установки значения из конвертера (что, очевидно, плохо) и фактического получения его на работу обычная коллекция не 'у него нет понятия порядка в его элементах, поэтому, когда я иду дальше, когда я хочу добавить аудио часть в середине остальных, на дисплее отображается моценил
Кроме того, когда я буду реализовывать больше бизнес-логики, мне может понадобиться доступ к началу и концу звуковых частей, которые рассчитаны в этом преобразователе, и что, если они еще не отображаются ...?
Так что этот подход был неправильным на нескольких уровнях.
Именно здесь я начал искать в Google и узнал о 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 ...
Так что я думаю, что могу сделать перегрузки для каждого из этих методов, но это звучит довольно неприятно...
Короче говоря: мне нужна какая-то коллекция, в которой каждый элемент знает детали предыдущего, чтобы вычислить одно из своих собственных свойств.
Anyключи?это даже хорошее решение?
Спасибо!
Приложение, 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.Это немного работы, но я думаю, что не будет никакого элегантного решения моей проблемы ...