为什么我的“事件”总是为空?

时间:2010-08-16 21:02:00

标签: c#

我正在尝试连接一个新事件,但出于某种原因,“Changed”总是评估为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,Changed没有)

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

真的很奇怪,因为我也在实现INotifyPropertyChanged(有效),而且这段代码几乎完全一样(我尝试使用相同的deligate类型,但它仍然不起作用。

我一直在使用这个网站作为参考 http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

4 个答案:

答案 0 :(得分:20)

好吧,您还没有显示订阅该活动的任何代码。你在哪里有这样的代码:

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

?如果您可以制作一个简短但完整的程序来证明问题,那么诊断将会容易得多。

答案 1 :(得分:3)

您必须将事件处理程序附加到Changed事件,然后才会将其评估为null。

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

答案 2 :(得分:2)

你错过了这个:

List.Changed += new ChangedEventHandler(ListChanged);

答案 3 :(得分:1)

您是否已将值,或更具体地说,事件处理程序分配给任何地方的更改? 如果未分配值,则它应为null ...