2010-08-16 28 views
5

estoy tratando de conectar un nuevo evento, pero por alguna razón "transformados" siempre se está evaluando en nulo¿Por qué mi "Evento" siempre es nulo?

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

La suscripción de código (PropertyChanged Obras, cambiada no pasa)

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

Es realmente extraño porque también estoy implementando INotifyPropertyChanged (que funciona), y este código es casi exactamente el mismo (he intentado usar el mismo tipo deligate, pero aún así no funciona.

He estado usando este sitio web como referencia http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

+0

Probablemente suscrito al objeto equivocado. –

+0

Creo que el problema podría ser que mi clase es de naturaleza jerárquica. y el evento siempre se aplicará a un elemento hijo, y nunca a la raíz. –

+0

Ha confirmado que se puede conectar directamente un nodo específico _playgroupTree.Children [0] .Changed + = new EventHandler (ReportingView_Changed); –

Respuesta

17

Bueno, no ha mostrado ningún código para suscribirse al evento. ¿Dónde tiene un código como este:

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

? Si puede producir un programa completo pero completo que demuestre el problema, será mucho más fácil de diagnosticar.

+0

@Downvoter: ¿Desea comentar? –

+0

gracias, se actualizará arriba con la suscripción ... probará una pequeña aplicación de demostración para replicar (estaba en un poco de pánico con una fecha límite, pero ahora se ha eliminado la función). –

+2

@Jon Skeet ¿Por qué se debe tener al menos un controlador asociado al evento para activarlo? Una clase puede querer activar su evento siempre que ocurra, independientemente de lo que esté asociado. No entiendo. ¿Tiene que probar la nulidad de su evento cada vez que quiera desencadenarlo? ¿No puede la lista de controladores del evento ser emprty en lugar de que el evento sea nulo? – Virus721

3

Debe adjuntar un controlador de eventos al evento Modificado, solo entonces no se evaluará como nulo.

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

tiene el código actualizado arriba –

1

¿Ha asignado un valor, o más específicamente, un controlador de eventos, a Cambiado en cualquier lugar? Debe ser nula si no se le asignó un valor ...

2

se ha perdido esto:

List.Changed += new ChangedEventHandler(ListChanged);
Cuestiones relacionadas