none
一个MVVM例子中调用事件的问题 RRS feed

  • 问题

  • 先谢谢各位高手和热心人。

    在WPFMVVM官方例子中,ViewModelBase类有这样一段代码

            protected virtual void OnPropertyChanged(string propertyName)
            {
                this.VerifyPropertyName(propertyName);

                PropertyChangedEventHandler handler = this.PropertyChanged;
                if (handler != null)
                {
                    var e = new PropertyChangedEventArgs(propertyName);
                    handler (this, e);
                }
            }

    我的问题是这个handler有什么用,为什么不直接用PropertyChanged。

    谢谢。

    2011年1月14日 15:23

答案

  • 因为当这个累的实例没有创建前,这个handler是null,在C#中,一个委托如果为null的时候,是无法调用,会抛出异常。这点不像VB.Net中,我们可以直接调用。所以这里我们需要做一次null检查,来保证这个委托存在,并且可以调用。

    这段代码是一段很规范的OnPropertyChanged代码,具有通用性。

    Sincerely,


    Bob Bao [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年1月17日 15:23
    版主
  • 你好 哈弗洛克,

    Bob说的正确,PropertyChanged是一个委托,当你注册一个事件委托的时候,PropertyChanged将会是Null,所以我们要检查PropertyChanged是不是Null来保证我们的程序不会倒掉。

    但是,针对你的问题:“我的问题是这个handler有什么用,为什么不直接用PropertyChanged。”

    根据我的分析 我觉得你的意思是想询问可不可以这样写

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

    就是直接用PropertyChanged去判断,而不用创建一个handler,如果我误解了你的意思,请告诉我。

    根据我的经验,这么写是可以的,至少我现在还没有发现权威的文档指出这样写的错误。

    如果你对你的问题还是存有疑惑,告诉我。

     

    Best regards,


    Sheldon _Xiao [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年1月21日 12:30
    版主

全部回复

  • 因为当这个累的实例没有创建前,这个handler是null,在C#中,一个委托如果为null的时候,是无法调用,会抛出异常。这点不像VB.Net中,我们可以直接调用。所以这里我们需要做一次null检查,来保证这个委托存在,并且可以调用。

    这段代码是一段很规范的OnPropertyChanged代码,具有通用性。

    Sincerely,


    Bob Bao [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年1月17日 15:23
    版主
  • 你好 哈弗洛克,

    Bob说的正确,PropertyChanged是一个委托,当你注册一个事件委托的时候,PropertyChanged将会是Null,所以我们要检查PropertyChanged是不是Null来保证我们的程序不会倒掉。

    但是,针对你的问题:“我的问题是这个handler有什么用,为什么不直接用PropertyChanged。”

    根据我的分析 我觉得你的意思是想询问可不可以这样写

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

    就是直接用PropertyChanged去判断,而不用创建一个handler,如果我误解了你的意思,请告诉我。

    根据我的经验,这么写是可以的,至少我现在还没有发现权威的文档指出这样写的错误。

    如果你对你的问题还是存有疑惑,告诉我。

     

    Best regards,


    Sheldon _Xiao [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年1月21日 12:30
    版主