在我的 WPF 应用程序中,我有一个 ItemsControl,其项目值取决于上一个显示的项目。
ViewModel 是一个分割成可变长度部分的音频文件,我需要以这种方式显示它,右侧显示一个 DateTime,这就是我需要计算的(我只知道每个部分的长度,我需要计算它开始和结束的实际时间,以及 ItemsControl 上的位置)。
--
----
------------
--
--------------------
我的第一种方法是使用一个ObservableCollection<MyviewModel>
但很快就发生了一些恐怖事件:
5-way multibinding 在其中IMultiValueConverter
我将计算要返回的值并将 DataContext 的属性设置为该值,因为我只知道运行时的前一个元素。
前一个元素是使用绑定发送的Relativesource.PreviousData
。
现在我的问题是,在从 Converter 设置一个值(这显然是一件坏事)并实际让它工作之后,常规 Collection 在其元素中没有顺序的概念,所以当更进一步时我想在其余部分中间添加一个音频部分,显示混乱。
此外,当我要实现更多业务逻辑时,我可能需要访问在此转换器中计算的音频部分的开始和结束,如果它还没有显示怎么办......?
所以这种方法在几个层面上都是错误的。
那是我开始谷歌搜索并发现的地方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
}
编辑:我想我会尝试结合 Thomas 和 Will 的答案:我将使用组合(即我在我的自定义对象中保留一个 LinkedList 的实例而不是从它继承)并重新定义要使用的方法(AddAfter、AddFirst等),我将在调用实际的 LinkedList 方法后调用 OnNotifyPropertychanged。这有点工作,但我想我的问题不会有任何优雅的解决方案......