2016-08-17 2 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 имеет тип NotifyCollectionChangedEventArgs Он содержит NewItems, OldItems и Action.

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 (object sender, CollectionChangeEventArgs e) {}' вместо использования лямбда, потому что вы должны отказаться от подписки (с 'c.CollectionChanged - = OnChange;') событие, если вы разгрузите представление. Это должно быть в представлении, потому что вы хотите что-то сделать в представлении. –

+0

Если вы хотите, чтобы представление реагировало на изменения, тогда вид должен быть тем, который будет прослушивать событие – Jason

Смежные вопросы