在我的WPF應用程序中,我有一個ItemsControl,其項目值取決於顯示的前一項。Observable LinkedList
ViewModel是一個音頻文件,被分割成可變長度的部分,我需要以這種方式顯示它,並在右邊顯示DateTime,這就是我需要計算的(我只知道每個部分的長度,我需要計算它開始和結束的實際時間,以及ItemsControl上的位置)。
--
----
------------
--
--------------------
我的第一個方法是使用一個ObservableCollection<MyviewModel>
但很快一些恐怖發生:
5路multibinding其中的IMultiValueConverter
我計算的價值迴歸和DataContext的的屬性設置爲值,因爲我只知道運行時的前一個元素。
上一個元素是使用Relativesource.PreviousData
上的綁定發送的。
現在我的問題是,從轉換器(這顯然是一件壞事)設置一個值,並真正讓它工作後,一個常規集合沒有在其元素的順序的概念,所以當進一步當我想在其餘的中間添加一個音頻部分的時候,顯示器會混亂。另外,當我實現更多業務邏輯時,我可能需要訪問在此轉換器中計算出的音頻部分的開始和結束,以及如果尚未顯示音頻部分的開始和結束......?????????????
所以這種方法在幾個層面上是錯誤的。
這就是我開始使用Google進行搜索並找到約LinkedList
。現在,我想做一個類,基本上是一個可觀察的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 ...
所以我想我可以使重載每種方法,但聽起來很討厭...
簡而言之:我需要某種集合,其中每個物品都知道前一個物品的細節,以便計算其中的一個物品自己的屬性。
任何線索?這是一個很好的解決方案嗎?
謝謝!
附錄,視圖模型是這樣的:
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等),我將在調用實際LinkedList方法後調用OnNotifyPropertychanged。這是一個工作,但我想沒有任何優雅的解決方案,我的問題...
您可能想要排除返回LinkedListNode的方法,因爲它公開公開了要包裝的內部LinkedList (通過其List屬性)。或者創建你自己的班級,你可以改爲返回。 –
AndrewS
@AndrewS我爲什麼要這樣做?訪問節點時要做什麼? –
因爲它公開地將內部LinkedList暴露給observablelinkedlist的任何用戶,所以有人可以直接操縱它,並且不會導致收集更改通知。 – AndrewS