私の WPF アプリには、アイテムの値が以前に表示されたアイテムに依存する ItemsControl があります。
ViewModel は可変長の部分に分割されたオーディオ ファイルであり、右側に DateTime が表示されるように表示する必要があり、それを計算する必要があります (各部分の長さしかわかりません。計算する必要があります。実際の開始時間と終了時間、および ItemsControl 上の位置)。
--
----
------------
--
--------------------
私の最初のアプローチは を使用することでしたObservableCollection<MyviewModel>
が、すぐにいくつかの恐怖が発生しました:
IMultiValueConverter
実行時に前の要素しか知らなかったので、返す値を計算し、DataContext のプロパティをその値に設定する5 ウェイ マルチバインディング。
前の要素は、 のバインディングを使用して送信されましたRelativesource.PreviousData
。
今私の問題は、コンバーターから値を設定した後(明らかに悪いことです)、実際にそれを機能させた後、通常のコレクションにはその要素に順序の概念がないため、さらに先の場合残りの途中にオーディオパートを追加したいのですが、表示がめちゃくちゃです。
さらに、さらにビジネスロジックを実装する場合、このコンバーターで計算されたオーディオ パーツの開始と終了にアクセスする必要があるかもしれませんが、まだ表示されていない場合はどうなりますか?
したがって、そのアプローチはいくつかのレベルで間違っていました。
そこでググって調べて知った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 を適切に呼び出せないことです...
したがって、これらのメソッドごとにオーバーロードを作成できると考えていますが、それはかなり厄介に聞こえます...
要するに、独自のプロパティの 1 つを計算するために、各項目が前の項目の詳細を知っているある種のコレクションが必要です。
手がかりはありますか?これも良い解決策ですか?
ありがとう!
付録、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 を呼び出すだけです。ちょっとした作業ですが、私の問題に対するエレガントな解決策はないと思います...