WeakPropertyChangedListener.PropertyChangedCallback で System.NullReferenceException

Silverlight で何かゴチャゴチャしてたら、よくわからん所で例外が出た。
検索したら、http://silverlight.net/forums/t/58548.aspx に対処方法が載ってたので試したら出なくなった。


データをバインドした際に、PropertyChanged イベントに Framework 内部で登録される ハンドラが無くなってこんな事が起きるってこと?よくわからん。
例外発生時のスタックトレース

場所 System.Windows.Data.WeakPropertyChangedListener.PropertyChangedCallback(Object sender, PropertyChangedEventArgs args)
場所 System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e)
場所 SilverlightClassLib.PropertyBase.OnPropertyChanged(String propertyName)
場所 SilverlightClassLib.Property`1.set_Value(T value)

調べたサイトを参考にコードを直すと例外が発生しなくなった。

protected void OnPropertyChanged(string propertyName)
{
  // 調べたサイトを参考にした、例外が発生しないコード
  foreach (PropertyChangedEventHandler del in this.PropertyChanged.GetInvocationList())
  {
    //NOTE: The invocation list is changed mid-foreach; a PropertyChangedEventHandler is invalidated.
    if (this.PropertyChanged.GetInvocationList().Contains(del))
    {
      del(this, new PropertyChangedEventArgs(propertyName));
    }
    else
    {
      Debug.WriteLine(string.Format("WARNING: Binding to property {0} failed", propertyName));
    }
  }

  // 例外が発生するコード
  //var handle = this.PropertyChanged;
  //if (handle == null)
  //{
  //  return;
  //}
  //handle(this, new PropertyChangedEventArgs(propertyName));
}

PropertyChanged.GetInvodationList() の Contains は拡張メソッドを作ってみた。

public static class ArrayEx {
  public static bool Contains(this Array array, object target) {
    foreach (object o in array) {
      if (o == target) {
        return true;
      }
    }
    return false;
  }
}


なんで例外が出るようになったのかは今調査中。。。