リストに基づいたカスタムコレクションを作成しています。その目的は、監視可能、重複防止、ソートなどです。
私は次のような add メソッドを持っています:
public class SortedObservableCollection<T> : List<T>, INotifyPropertyChanged, INotifyCollectionChanged
{
public void Add(T item)
{
base.Add(item);
base.Sort();
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item);
}
}
しかし、どういうわけか、オブジェクトがコレクション内で直接変更された場合、自動手段を実行するか、コレクションに通知して、再度ソートできるようにする必要があります。
お気に入り :
SortedObservableCollection<IRCUser> users = new SortedObservableCollection<IRCUser>();
users.Add(new IRCUser { Nick = "User1", Status = IRCUserStatus.Unknown });
users.Add(new IRCUser { Nick = "User2", Status = IRCUserStatus.Unknown });
users.Add(new IRCUser { Nick = "User3", Status = IRCUserStatus.Unknown });
users.Single(x => x.Nick == "User3").Nick = "User11";
User3 はコレクションの一番下にとどまります。私は独自の IComparable 実装を使用していることに注意してください。これは単なるアルファベット順の並べ替えではありません。
この変更をキャッチして通知するには、コレクションが必要です。これにより、何かを行うことができます。
オブジェクトに INotifyPropertyChanged を実装する必要があることはわかっていますが、コレクションがそれをどのようにキャッチするかについては不明です。
item.PropertyChanged += (o,e) { ..check then... base.Sort(); };
しかし、10,000 人のユーザーがいる場合、これでよいでしょうか?