0

J'essaie de déclencher PropertyChangedEventHandler à partir d'un rappel CollectionChanged. Il est levé, mais il n'atteint pas l'abonné.C#: Abonnement à un événement déclenché à partir d'un autre événement

Peut-être que je ne peux pas traiter un EventHandler comme une variable? Bien que je l'aie fait sans problème par le passé, je l'évoque simplement dans un autre événement où je suis en difficulté.

Toute aide appréciée, merci.

using System; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.ComponentModel; 

namespace Fire 
{ 
    /// <summary> 
    /// Simple class implementing INotifyPropertyChanged 
    /// I want to raise PropertyChanged whenever the ObservableCollection changes. 
    /// </summary> 
    public class Model : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     public ObservableCollection<int> Collection { get; set; } 

     public Model() 
     { 
      Collection = new ObservableCollection<int>(); 

      // In theory it should be sorted out here: 
      Utils.RaisePropertyChangedWhenCollectionChanged(this, Collection, PropertyChanged, "Collection"); 
     } 
    } 

    /// <summary> 
    /// I want to wrap the "If CollectionChanged then raise PropertyChanged" logic in a utility method". 
    /// </summary> 
    public class Utils 
    { 
     public static void RaisePropertyChangedWhenCollectionChanged(object owner, INotifyCollectionChanged collection, PropertyChangedEventHandler eventHandler, string propertyName) 
     { 
      collection.CollectionChanged += (object sender, NotifyCollectionChangedEventArgs e) => 
      { 
       eventHandler(owner, new PropertyChangedEventArgs(propertyName)); 
      }; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Model model = new Model(); 

      model.PropertyChanged += model_PropertyChanged; 

      // But the problem is that PropertyChanged does not fire, even when the collection is changed. 
      model.Collection.Add(2); 
     } 

     static void model_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      // This does not get called! 
      Console.Out.WriteLine(String.Format("{0}", e.PropertyName)); 
     } 
    } 
} 

Répondre

1

Dans cet appel:

Utils.RaisePropertyChangedWhenCollectionChanged(this, Collection, PropertyChanged, "Collection"); 

... vous passez la valeur actuelle de PropertyChanged, qui est un délégué sans op. Au lieu de cela, vous voulez qu'il augmente l'événement changé de propriété pour tous les gestionnaires sont présents lorsque l'événement est déclenché. Par exemple:

Utils.RaisePropertyChangedWhenCollectionChanged 
    (this, Collection, 
     (sender, args) => PropertyChanged(sender, args), 
     "Collection"); 
+0

Merci Jon! Cela semble si évident maintenant. – Nockm