2011-01-03 7 views
6

誰かが、CollectionChangedが実装されているサンプルを指すことができます。私はwpf mvvmライトを使用しています。私はグーグルにしようとしたが、十分なものが見つからなかった。CollectionChangedサンプル

+0

もう少し詳しくお願いします。あなたは何をしようとしているのですか? –

+0

私は、このデータグリッドのデータの編集/追加/削除が完了したときにインライン編集が有効になっているobservableCollection itemsourceを持つDataGridを持っています。このデータをWebサービスに送信して更新します。 – WhoIsNinja

+1

以下のArxisosの回答を受け入れることができません...下のコードは意味をなさない... NotifyCollectionChangedとNotifyCollectionChangedEventArgsの実装方法?簡単な説明はhttp://blog.stephencleary.com/2009/07/interpreting-notifycollectionchangedeve.htmlをご覧ください。また、実装や詳細についてのリンクもあります。何らかの理由で – Beachwalker

答えて

9
public ObservableCollection<string> Names { get; set; } 

public ViewModel() 
{ 
    names = new ObservableCollection<string>(); 
    Names.CollectionChanged += this.OnCollectionChanged; 
} 

void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //Get the sender observable collection 
    ObservableCollection<string> obsSender = sender as ObservableCollection<string>; 

    List<string> editedOrRemovedItems = new List<string>(); 
    foreach(string newItem in e.NewItems) 
    { 
     editedOrRemovedItems.Add(newItem); 
    } 

    foreach(string oldItem in e.OldItems) 
    { 
     editedOrRemovedItems.Add(oldItem); 
    } 

    //Get the action which raised the collection changed event 
    NotifyCollectionChangedAction action = e.Action; 
} 

NotifyCollectionChangedEventArgsの詳細については、hereを参照してください。

EDIT:追加/削除されたアイテムのリストが必要なので、サンプルコードを変更しました。

+0

が発生した場合、onCollectionChangedメソッドはアイテムの追加または削除の場合にのみ呼び出されます。編集項目の場合は表示されません。私はまたこれを進める方法を知りたいと思います。私は最終的に、新しく追加、削除、編集されたアイテムのリスト/コレクションを最終的に単一のコレクションに送る方法を意味します。ありがとう。 – WhoIsNinja

+0

投稿するには別の質問があるようです。 –

+1

ObservableCollectionは、編集要素でOnCollectionChangedを呼び出すための機能を提供していません。あなたはそれを自分でする必要があります。コレクション内のアイテムはINotifyPropertyChangedを実装する必要があり、INotifyPropertyChangedのPropertyChangedイベントにイベントリスナーを追加する必要があります。詳細については、http://stackoverflow.com/questions/269073/observablecollection-that-also-monitors-changes-on-the-elements-in-collectionを参照してください。 – Arxisos

1
public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

    } 
    private ObservableCollection<Person> persons = new ObservableCollection<Person>(); 


    public MainWindow() 
    { 
     InitializeComponent(); 
     dgPerson.ItemsSource = persons; 
     persons.CollectionChanged += this.OnCollectionChanged; 
    } 


    void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     //Get the sender observable collection 
     ObservableCollection<Person> obsSender = sender as ObservableCollection<Person>; 
     NotifyCollectionChangedAction action = e.Action; 
     if (action == NotifyCollectionChangedAction.Add) 
      lblStatus.Content = "New person added"; 
     if (action == NotifyCollectionChangedAction.Remove) 
      lblStatus.Content = "Person deleted"; 
    } 
    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     Person p = new Person(); 
     p.FirstName = txtFname.Text; 
     p.LastName = txtLname.Text; 

     persons.Add(p); 
    } 

A very simple complete example here

関連する問題