C#: подписка на событие, запущенное из другого события

Я пытаюсь поднять PropertyChangedEventHandler из обратного вызова CollectionChanged. Он поднимается, но не достигает подписчика.

Возможно, я не могу просто обработать EventHandler как переменную? Хотя я делал это без проблем в прошлом, я просто поднял его из другого события, где у меня возникли проблемы.

Любая помощь приветствуется, спасибо.

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));
        }
    }
}

1 ответ

Решение

В этом призыве:

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

... вы передаете текущее значение PropertyChanged, который является одним делегатом без операции. Вместо этого вы хотите, чтобы оно вызывало событие свойств измененного для всех присутствующих обработчиков при возникновении события. Например:

Utils.RaisePropertyChangedWhenCollectionChanged
     (this, Collection, 
      (sender, args) => PropertyChanged(sender, args),
      "Collection");
Другие вопросы по тегам