2010-08-16 39 views
5

Я пытаюсь подключить новое событие, но по какой-то причине «Изменено» всегда вычисляемая обнулитьПочему мое «событие» всегда имеет значение null?

public class MyTreeViewItem : INotifyPropertyChanged 

{ 
     private MyTreeViewItem _parent; 

     public MyTreeViewItem(MyTreeViewItem parent) 
     { 
      _parent = parent; 
     } 

     private bool _checked; 
     public bool Checked 
     { 
      get 
      { 
       return _checked; 
      } 
      set 
      { 
       if (value != _checked) 
       { 
        _checked = value; 
        OnChanged("test"); 
        OnPropertyChanged("Checked"); 
       } 
      } 
     } 

     public event EventHandler Changed; 

     public ObservableCollection<MyTreeViewItem> Children { get; set; } 

    // Invoke the Changed event; called whenever list changes 
    protected virtual void OnChanged(string test) 
    { 
     if (Changed != null) 
      Changed(this, null); 
    } 

Подписавшаяся код (PropertyChanged Works, Измененное не)

_playgroupTree = new MyTreeViewItem(null); 
AddChildNodes(4, ref _playgroupTree); 
_playgroupTree.Changed += new EventHandler(_playgroupTree_Changed); 
_playgroupTree.PropertyChanged += new PropertyChangedEventHandler(_playgroupTree_PropertyChanged); 

Это действительно странно, потому что я также внедряю INotifyPropertyChanged (который работает), и этот код почти точно такой же (я пытался использовать один и тот же тип деления, но все равно он не работает.

Я пользуюсь этим сайтом в качестве ссылки http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

+0

Вы, вероятно, подписались на неправильный объект. –

+0

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

+0

Подтвердили, что можно напрямую подключить определенный узел _playgroupTree.Children [0] .Changed + = new EventHandler (ReportingView_Changed); –

ответ

17

Что ж, вы не указали код, подписавшийся на это мероприятие. Где у вас есть такой код:

YourClass yc = new YourClass(); 
yc.Changed += SomeHandler; 

? Если вы можете создать короткую, но полную программу, демонстрирующую проблему, ее будет намного легче диагностировать.

+0

@ Downvoter: Заметь прокомментировать? –

+0

спасибо, обновит выше с подпиской ... попробует небольшое демонстрационное приложение для репликации (было просто в панике с крайним сроком, но вытащил эту функцию сейчас). –

+2

@Jon Skeet Зачем нужно иметь хотя бы один обработчик, связанный с событием, чтобы вызвать его? Класс может захотеть инициировать его событие всякий раз, когда это происходит, независимо от того, что к нему привязано. Я не понимаю. Нужно ли вам проверять, нет ли значение вашего события каждый раз, когда вы хотите его запустить? Не может ли список обработчика события быть emprty вместо того, чтобы событие было нулевым? – Virus721

3

Необходимо связать обработчик событий с событием «Изменено», только тогда оно не будет оцениваться как null.

Changed += (s, e) => Console.WriteLine("received Changed event"); 
if (Changed != null) Console.WriteLine("now Changed is not null"); 
+0

обновленный код выше –

1

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

2

вы пропустили это:

List.Changed += new ChangedEventHandler(ListChanged);
Смежные вопросы