내 WPF 앱에서 항목 값이 이전 항목 에 따라 달라지는 ItemsControl이으로 표시됩니다.Observable LinkedList
ViewModel은 가변 길이 부분으로 분할 된 오디오 파일이며 오른쪽에 DateTime이 표시되는 방식으로 표시해야합니다. 그 값은 계산해야합니다 (각 부분의 길이 만 알고 있습니다. 내가 시작하고 끝나는 실제 시간과 ItemsControl에 위치를 계산해야합니다).
--
----
------------
--
--------------------
내 첫 번째 방법은 ObservableCollection<MyviewModel>
을 사용했지만 곧 약간의 공포가 발생했습니다 :
IMultiValueConverter
내가 값을 계산하는 것입니다있는
5 방향 multibinding 왜냐하면 나는 단지 런타임에 이전 요소를 알고 있었기 때문이다.
이전 요소는 Relativesource.PreviousData
에 바인딩을 사용하여 보냈습니다.
이제 내 문제는 변환기 (분명히 나쁜 것)에서 값을 설정하고 실제로 작동 시키면 정규 컬렉션에 해당 요소의 순서 개념이 없으므로 더 이상 나머지 부분의 중간에 오디오 파트를 추가하고 싶을 때 디스플레이가 엉망입니다.
더 많은 비즈니스 로직을 구현할 때이 변환기에서 계산되는 오디오 부분의 시작 및 끝 부분에 액세스해야 할 수 있으며 아직 표시되지 않은 경우에는 어떻게해야합니까?
그런 접근법은 여러 단계에서 잘못되었습니다.
내가 검색을 시작하고 대략 LinkedList
에 대해 알아 냈습니다. 지금은 기본적으로 관찰 가능한 LinkedList의 인 클래스를 만들려고 해요 (I는 일반적으로 필요하지 않은) :
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
}
그리고 문제의 핵심은 내가 메소드를 오버라이드 (override) 할 수 없다는 것입니다을 그 ... 컬렉션 (의 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의 인스턴스를 유지 즉, 내가 (구성을 사용할 것이다 : 나는 토마스와 윌의 답변을 결합하려고 생각 그것으로부터 상속받은) 그리고 실제 LinkedList 메서드를 호출 한 후에 OnNotifyPropertychanged를 호출 할 AddAfter, AddFirst 등의 메소드를 재정의하십시오. 그것은 약간의 일이지만 내 문제에 대한 어떤 우아한 해결책도 없을 것이라고 생각합니다 ...
LinkedListNode을 반환하는 메서드는 List 속성을 통해 래핑하려는 내부 LinkedList 을 공개적으로 노출하므로이 메서드를 제외 할 수 있습니다. 또는 대신 돌아올 수있는 자신 만의 클래스를 만드십시오. –
AndrewS
@AndrewS 왜 내가 그걸하고 싶습니까? 노드에 액세스 할 때 수행해야 할 작업은 무엇입니까? –
내부 링크드 목록을 observablelinkedlist의 모든 사용자에게 공개하기 때문에 누군가가 직접 링크를 조작 할 수 있으며 콜렉션 변경 알림이 발생하지 않기 때문입니다. – AndrewS