TrulyObservableCollection
WPFDataGridのデータソースとしてを使用しています。私のクラスはPropertyChange
イベントを適切に実装します(プロパティが変更されると通知を受け取ります)。CollectionChanged
イベントもトリガーされます。しかし、私の問題はPropertyChanged
イベントとCollectionChanged
イベントの関係にあります。PropertyChanged
どのアイテム(この場合はオブジェクト)が変更されているかはわかりますが、イベントsender
内からどのアイテムが変更されているかを確認する方法が見つからないようですCollectionChanged
。オブジェクトはsender
コレクション全体です。CollectionChanged
イベントでどのアイテムが変更されたかを確認する最良の方法は何ですか?関連するコードスニペットは以下のとおりです。ご協力いただきありがとうございます。説明が必要な場合はお知らせください。
コレクションを設定するためのコード:
private void populateBret()
{
bretList = new TrulyObservableCollection<BestServiceLibrary.bretItem>(BestClass.BestService.getBretList().ToList());
bretList.CollectionChanged += bretList_CollectionChanged;
dgBretList.ItemsSource = bretList;
dgBretList.Items.Refresh();
}
void bretList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//Do stuff here with the specific item that has changed
}
コレクションで使用されるクラス:
public class bretItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int _blID;
public string _blGroup;
[DataMember]
public int blID
{
get { return _blID; }
set
{
_blID = value;
OnPropertyChanged("blID");
}
}
[DataMember]
public string blGroup
{
get { return _blGroup; }
set
{
_blGroup = value;
OnPropertyChanged("blGroup");
}
}
protected void OnPropertyChanged (String name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
TrulyObservableCollectionクラス
public class TrulyObservableCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
public TrulyObservableCollection()
: base()
{
CollectionChanged += new NotifyCollectionChangedEventHandler(TrulyObservableCollection_CollectionChanged);
}
public TrulyObservableCollection(List<T> list)
: base(list)
{
foreach (var item in list)
{
item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
}
CollectionChanged += new NotifyCollectionChangedEventHandler(TrulyObservableCollection_CollectionChanged);
}
void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (Object item in e.NewItems)
{
(item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
}
}
if (e.OldItems != null)
{
foreach (Object item in e.OldItems)
{
(item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
}
}
}
void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
OnCollectionChanged(a);
}
}
編集:
がで設定されているitem_PropertyChanged
場合。これにより、とがnullになるため、その場合、変更されたアイテムを取得できません。データグリッドが追加アイテムで更新されているため、使用できません。変更されたアイテムを取得するためにも、仕事に取り掛かることができないようです。NotifyCollectionChangedEventArgs
NotifyCollectionChangedAction.Reset
OldItems
NewItems
.Add
.Replace