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; } }
なんで例外が出るようになったのかは今調査中。。。