none
public event PropertyChangedEventHandler PropertyChanged; RRS feed

答案

  • 你说的对,是事件委托。

    所谓“事件委托”,一个事件的本质是一个委托(因为事件是委托类型的)。而委托的好处在于它可以动态调用不同类之间具备相同函数签名(函数参数顺序、类型、个数相同),且函数返回值必须完全相同的函数。我先举一个委托的例子:

    namespace A
    {

     

    public delegate void Say();    //委托

     

    class Dog
    {
    public void Say()
    {
    Console.WriteLine("汪汪!");
    }
    }
    class Cat
    {
    public void Say()
    {
    Console.WriteLine("喵喵!");
    }
    }
    public class MainTest
    {
    static void Main(string[] args)
    {
    Say s = new Say(new Dog().Say); //告诉委托调用Dog类中的Say方法
    s += new Cat().Say; //同时告诉委托调用Cat类中的Say方法

    s();
    }
    }
    }

    Dog和Cat类毫无联系,但是却可以通过委托连接起来关系,我们说委托具备“跨类调用”函数的特性。

    因此,我们再来看一个事件的应用:

    public class MyClass

    {

     

    public event EventHandler MyEvent = null; //EventHandler是一个系统委托,一般用于定义事件

     

    ………………

     

    public void MyMethod() //这是一个引发事件的方法,一旦调用该方法,必然触发事件

     

    {

     

    ………………

     

    //引发一个事件!!

     

    MyEvent(this,null);

     

    }

     

    }

     

    主函数中:

     

    MyClass mc = new MyClass();

     

    mc.MyEvent+=new EventHandler(MyEvent_Raised);

     

    ………………

     

    static void MyEvent_Raised(object sender, EventArgs e)

     

    {

     

    ……………… //做你想做的事情

     

    }
    事件的实例化是在使用到包含这个事件的实体类时候(比如在主函数需要调用的时候)。通过+=进行实体化;然后当调用实体的MyMethod方法时候,这个方法将引发一个事件,也就是触发了绑定的MyEvent_Raised方法。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月6日 5:03
    版主
  • Hi bianchunlei,
    欢迎来到MSDN论坛!

    如果你想了解更多关于事件的信息,请参考以下MSDN链接:

    事件(C# 编程指南)
    http://msdn.microsoft.com/zh-cn/library/awbftdfh.aspx EventHandler

    委托
    http://msdn.microsoft.com/zh-cn/library/system.eventhandler.aspx

    代码 public event PropertyChangedEventHandler PropertyChanged; 的内部逻辑如下:

     

        public event PropertyChangedEventHandler PropertyChanged
        {
            add
            {
                PropertyChangedEventHandler handler2;
                PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                do
                {
                    handler2 = propertyChanged;
                    PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Combine(handler2, value);
                    propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
                }
                while (propertyChanged != handler2);
            }
            remove
            {
                PropertyChangedEventHandler handler2;
                PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                do
                {
                    handler2 = propertyChanged;
                    PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Remove(handler2, value);
                    propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
                }
                while (propertyChanged != handler2);
            }
        }
    

     

    PropertyChangedEventHandler IL代码如下:

     

         .class public auto ansi sealed PropertyChangedEventHandler
             extends [mscorlib]System.MulticastDelegate
         {
            .custom instance void [mscorlib]System.Security.Permissions.HostProtectionAttribute::.ctor(valuetype [mscorlib]System.Security.Permissions.SecurityAction) = { valuetype [mscorlib]System.Security.Permissions.SecurityAction::LinkDemand SharedState=bool(true) }
            .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native\20int 'method') runtime managed
            {
            }
    
            .method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(object sender, class       System.ComponentModel.PropertyChangedEventArgs e, class [mscorlib]System.AsyncCallback callback, object 'object') runtime managed
            {
            }
    
            .method public hidebysig newslot virtual instance void EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
            {
            }
    
            .method public hidebysig newslot virtual instance void Invoke(object sender, class System.ComponentModel.PropertyChangedEventArgs e) runtime managed
            {
            }
        }
    
    

    希望对你有所帮助!

    加油!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月7日 7:01
    版主

全部回复

  • 你说的对,是事件委托。

    所谓“事件委托”,一个事件的本质是一个委托(因为事件是委托类型的)。而委托的好处在于它可以动态调用不同类之间具备相同函数签名(函数参数顺序、类型、个数相同),且函数返回值必须完全相同的函数。我先举一个委托的例子:

    namespace A
    {

     

    public delegate void Say();    //委托

     

    class Dog
    {
    public void Say()
    {
    Console.WriteLine("汪汪!");
    }
    }
    class Cat
    {
    public void Say()
    {
    Console.WriteLine("喵喵!");
    }
    }
    public class MainTest
    {
    static void Main(string[] args)
    {
    Say s = new Say(new Dog().Say); //告诉委托调用Dog类中的Say方法
    s += new Cat().Say; //同时告诉委托调用Cat类中的Say方法

    s();
    }
    }
    }

    Dog和Cat类毫无联系,但是却可以通过委托连接起来关系,我们说委托具备“跨类调用”函数的特性。

    因此,我们再来看一个事件的应用:

    public class MyClass

    {

     

    public event EventHandler MyEvent = null; //EventHandler是一个系统委托,一般用于定义事件

     

    ………………

     

    public void MyMethod() //这是一个引发事件的方法,一旦调用该方法,必然触发事件

     

    {

     

    ………………

     

    //引发一个事件!!

     

    MyEvent(this,null);

     

    }

     

    }

     

    主函数中:

     

    MyClass mc = new MyClass();

     

    mc.MyEvent+=new EventHandler(MyEvent_Raised);

     

    ………………

     

    static void MyEvent_Raised(object sender, EventArgs e)

     

    {

     

    ……………… //做你想做的事情

     

    }
    事件的实例化是在使用到包含这个事件的实体类时候(比如在主函数需要调用的时候)。通过+=进行实体化;然后当调用实体的MyMethod方法时候,这个方法将引发一个事件,也就是触发了绑定的MyEvent_Raised方法。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月6日 5:03
    版主
  • 非常感谢,有点明白了。就这个问题的话,那个PropertyChanged事件所绑定的具体方法是不是可以理解为被微软隐藏了?有段代码是这样的:

     if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(imaName));

    2011年10月6日 7:37
  • 非常感谢,有点明白了。就这个问题的话,那个PropertyChanged事件所绑定的具体方法是不是可以理解为被微软隐藏了?有段代码是这样的:

     if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(imaName));


    不一定,这个方法应该是你自己绑定的。

    PropertyChanged只是一个事件,不是一个方法。

    这个事件所绑定的方法应该在你的程序中,这里看不到的。(请仔细看我的MyMethod,其中也类似使用了MyEvent,你不能说MyEvent方法被隐藏了,而是在外部,你看不到,比如在主函数中被动态绑定调用了)。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月6日 7:40
    版主
  • 还有就是这些例子完全可以不用委托、事件什么的,用委托、事件有哪些好处呢?您提到的跨类调用又有什么实际用途呢?其实还是申明了类的实例才跨类调用的啊~直接用实例调用不是一样吗?哎~是不是我想的多了,但实在没有切切实实的感受。望多多指教~
    2011年10月6日 8:02
  • 我举的例子过于简单,只是想证明“委托”的跨类调用以及“事件”的本质。

    其实,“跨类调用”非常重要,它最初的雏形是“监听模式”(如果你看过OOP设计模式应该了解)。是为了针对两个不同类之间如何相互传递消息而指定出的法则。

    设想一下,如果没有这个机制,那么你一个拖拽在页面上的Button,“点击”以后怎么触发事件呢(注意:一个Button是一个类,一个页面也是一个类,毫无关系哦)——按钮点击事件也就是通过委托事件传递消息的。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月6日 8:08
    版主
  • 这个PropertyChanged事件是类库的一个接口INotifyPropertyChanged的一个事件,它的方法程序员也能看不到吗 ?
    2011年10月6日 8:54
  • 好吧,水平有限,得再加把劲 !谢了
    2011年10月6日 8:55
  • 这个PropertyChanged事件是类库的一个接口INotifyPropertyChanged的一个事件,它的方法程序员也能看不到吗 ?

    事件是要被“委托的”,至于被委托的那个函数是你自己写的,看不到的
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月6日 8:56
    版主
  • 又凌乱了~我自己写的怎么会看不到?而且我肯定没写啊,什么意思?

    我写的是触发这个事件的方法,没写处理这个事件的方法~

    2011年10月6日 9:06
  • 又凌乱了~我自己写的怎么会看不到?而且我肯定没写啊,什么意思?

    我写的是触发这个事件的方法,没写处理这个事件的方法~


    看来你还是没有搞清楚概念啊,哈哈!

    对,你写的是触发这个事件的方法,但是这个方法是通过委托绑定的啊。不会和事件在同一个类里边,自然看不到。

    我问你:

    请仔细看我的例子——你的事件定义和引发在MyClass类中,但是事件绑定的真正代码却在主函数中(主函数应该是另一个类)!!!!

    你能看到吗?


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月6日 9:08
    版主
  • Hi bianchunlei,
    欢迎来到MSDN论坛!

    如果你想了解更多关于事件的信息,请参考以下MSDN链接:

    事件(C# 编程指南)
    http://msdn.microsoft.com/zh-cn/library/awbftdfh.aspx EventHandler

    委托
    http://msdn.microsoft.com/zh-cn/library/system.eventhandler.aspx

    代码 public event PropertyChangedEventHandler PropertyChanged; 的内部逻辑如下:

     

        public event PropertyChangedEventHandler PropertyChanged
        {
            add
            {
                PropertyChangedEventHandler handler2;
                PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                do
                {
                    handler2 = propertyChanged;
                    PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Combine(handler2, value);
                    propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
                }
                while (propertyChanged != handler2);
            }
            remove
            {
                PropertyChangedEventHandler handler2;
                PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                do
                {
                    handler2 = propertyChanged;
                    PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Remove(handler2, value);
                    propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
                }
                while (propertyChanged != handler2);
            }
        }
    

     

    PropertyChangedEventHandler IL代码如下:

     

         .class public auto ansi sealed PropertyChangedEventHandler
             extends [mscorlib]System.MulticastDelegate
         {
            .custom instance void [mscorlib]System.Security.Permissions.HostProtectionAttribute::.ctor(valuetype [mscorlib]System.Security.Permissions.SecurityAction) = { valuetype [mscorlib]System.Security.Permissions.SecurityAction::LinkDemand SharedState=bool(true) }
            .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native\20int 'method') runtime managed
            {
            }
    
            .method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(object sender, class       System.ComponentModel.PropertyChangedEventArgs e, class [mscorlib]System.AsyncCallback callback, object 'object') runtime managed
            {
            }
    
            .method public hidebysig newslot virtual instance void EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
            {
            }
    
            .method public hidebysig newslot virtual instance void Invoke(object sender, class System.ComponentModel.PropertyChangedEventArgs e) runtime managed
            {
            }
        }
    
    

    希望对你有所帮助!

    加油!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月7日 7:01
    版主
  • 谢谢,一定加油!内部逻辑在哪可以查到啊?还有IL代码是不是visual studio 有自带的工具可以显示的?

    2011年10月7日 10:27
  • 谢谢,一定加油!内部逻辑在哪可以查到啊?还有IL代码是不是visual studio 有自带的工具可以显示的?

    1)内部逻辑?你是不是说你想看“PropertyChanged”的代码?我早就说过了啊——这是一个事件,事件自身没有代码的,我问你:请仔细看我的示例代码——MyEvent 是一个事件对吧?你通过反编译能够在MyClass中看到MyEvent的代码吗???看来你事件的概念还是很迷糊……

    2)IL代码的确可以通过“IL Disassembler”看到


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月8日 1:01
    版主
  • 代码 public event PropertyChangedEventHandler PropertyChanged; 的内部逻辑如下:

     

        public event PropertyChangedEventHandler PropertyChanged
        {
            add
            {
                PropertyChangedEventHandler handler2;
                PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                do
                {
                    handler2 = propertyChanged;
                    PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Combine(handler2, value);
                    propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
                }
                while (propertyChanged != handler2);
            }
            remove
            {
                PropertyChangedEventHandler handler2;
                PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
                do
                {
                    handler2 = propertyChanged;
                    PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Remove(handler2, value);
                    propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
                }
                while (propertyChanged != handler2);
            }
        }
    
    2011年10月8日 8:12
  • Get it now?我可以用吗?
    2011年10月13日 8:09
  • Get it now?我可以用吗?

    这是微软内部代码,你可以仿造去拷贝应用。不过请根据实际情况修改:)
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月13日 8:12
    版主
  • 看到这个地方我想问一下,从哪可以找到内部代码呢?

    另外,对于**EventHandler这个关键字本身是怎么实现的我有些含糊不清。

    比如 public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e); 像这句中的PropertyChangedEventHandler是一个类,那它们都是从哪定义的并且怎样识别这事时间发生的呢?(比如loaded,页面怎么知道已经loaded完了)

    可能我对这个问题的描述本身就不对,差不多就这么个意思。

    thanks

     


    • 已编辑 kaka0914 2011年11月29日 1:57 描述错误
    2011年11月28日 16:09