2016-08-17 21 views
1

ObservableCollectionとCollectionChangedイベントの使用方法が不思議です。私はそれにストロークを描画するCanvasクラスを持っています。 CollectionChangedイベントハンドラをCanvasクラスに配置し、コレクションの変更をリッスンするか、ストロークのコレクションをホストするモデルを配置しますか?c#ObservableCollection:CollectionChangedイベントを実装する方法

public partial class CollectionBindingPage : ContentPage 
{ 
    private ObservableCollection<Object> c; 

    public CollectionBindingPage() 
    { 
     InitializeComponent(); 

     c.CollectionChanged += (sender, e) => { 
      //Update the display when strokes was added or removed. 
     }; 
    } 


    public class Object 
    { 
     public string A { get; set; } 
     public string B { get; set; } 
    } 

    public class ViewModel 
    { 
     public ObservableCollection<Object> collection { get; set; } 
    } 
} 

申し訳ありませんこれを初めて使用しています。

+0

あなたはキャンバスのItemsSourceプロパティにコレクションプロパティをバインドします。それはあなたがしなければならないすべてのことです。 – Will

答えて

2

eは、それはNewItemsOldItemsActionが含まれているタイプNotifyCollectionChangedEventArgsです。

c.CollectionChanged += (sender, e) => { 
    Console.WriteLine($"{e.Action}"); 
    // check e.Action and draw your stuff  
}; 

https://msdn.microsoft.com/en-us/library/system.collections.specialized.notifycollectionchangedeventargs(v=vs.110).aspx

mentoined解決のためのスケッチコメントで

class MyObject : INotifyPropertyChanged 
{ 
    private string _a; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string A 
    { 
     get { return _a; } 
     set 
     { 
      _a = value; 
      OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

class Pagey : ContentPage 
{ 
    private ObservableCollection<MyObject> c = new ObservableCollection<MyObject>(); 

    // somwhere in your code 
    c.CollectionChanged += OnCollectionChanged; 

    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) 
    { 
     if (args.NewItems != null) 
     { 
      foreach (var item in args.NewItems.Cast<MyObject>()) 
      { 
       item.PropertyChanged += OnChanged; 
      } 
     } 

     if(args.OldItems != null) 
     { 
      foreach (var item in args.OldItems.Cast<MyObject>()) 
      { 
       item.PropertyChanged -= OnChanged; 
      } 
     } 

     Redraw(); 
    } 

    private void OnChanged(object sender, PropertyChangedEventArgs e) 
    { 
     Redraw(); 
    } 

    private void Redraw() 
    { 

    } 
} 
+0

私はちょっと混乱してイベントを配置する必要があります。モデルクラスまたはビュークラス – LittleFunny

+0

Mabeでは、ラムダを使用する代わりに、ハンドラを 'public OnChange(オブジェクト送信者、CollectionChangeEventArgs e){}'関数に移動する必要があります。ビューをアンロードすると、イベントをキャンセルする必要があるからです( 'c.CollectionChanged - = OnChange;')。それはビューの中になければなりません。ビュー内で何かしたいからです。 –

+0

ビューに変更が反映されるようにするには、ビューがイベントをリッスンするビューでなければなりません – Jason

関連する問題