在我的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