Событие INotifyPropertyChanged PropertyChangedEventHandler всегда равно нулю - PullRequest
6 голосов
/ 20 февраля 2011

Я реализовал INotifyPropertyChanged для следующего класса

 public class FactoryItems : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        string symbol;
        public string Symbol
        {
            get { return symbol; }
            set { symbol = value; OnPropertyChanged("Symbol"); }
        }

        public FactoryItems()
        {

        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

Когда свойство Symbol изменяет событие без проблем, но событие PropertyChanged всегда пустое, этот класс создается только один раз, я установил точку остановав конструкторе, чтобы убедиться, что это так.

В другом классе я подписываюсь на него следующим образом:

Data.Tables.FactoryItems = new Data.FactoryItems();
Data.Tables.FactoryItems.PropertyChanged += 
new System.ComponentModel.PropertyChangedEventHandler(FactoryItems_SymbolChanged);

void FactoryItems_SymbolChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
  doSomething();
}

Но обработчик всегда равен null, поскольку PropertyChanged равен null.Любая идея, как заставить это работать?

Большое спасибо.

Ответы [ 4 ]

5 голосов
/ 20 февраля 2011

Вы подписываетесь на событие в одном конкретном случае.
Это не влияет на другие экземпляры.

Чтобы увидеть изменения для всех экземпляров, вы можете использовать статическое событие.
Помните, что любой класс, подписывающийся на статическое событие, останется в памяти навсегда.

3 голосов
/ 20 февраля 2011

Пока кто-то не подпишется на событие, оно останется null.

1 голос
/ 20 февраля 2011

Существуют различные типы, которые будут подписываться на это - в частности, такие как DataGridView (winforms, но похожи в WPF и т. Д.), Но только при привязке к данным (установить DataSource) и только , если список также поддерживает привязку - например, BindingList<T>.

Чтобы проверить, просто подпишитесь, если вы сами с PropertyChanged += ....

0 голосов
/ 20 февраля 2011

Вы просто устанавливаете значение свойства Symbol в коде и отлаживаете оттуда? В этом случае ничто, возможно, не подписалось на событие PropertyChanged.

Если вы занимаетесь разработкой XAML, попробуйте установить DataContext для элемента XAML в качестве экземпляра вашего типа FactoryItems, а затем связать свойство Symbol со свойством Text в TextBox ( например), и вы обнаружите, что механизм привязки XAML подписался на событие PropertyChanged, поэтому он не будет нулевым.

Либо просто попросите другой тип вручную подписаться на ваше событие FactoryItems PropertyChanged, чтобы проверить вещи в коде.

...