/// <summary> /// イベントハンドラ<br/> /// </summary> /// <param name="sender">イベント元</param> /// <param name="e">パラメーター</param> /// <author>Takanori Shibuya.</author> public void ChangeHandler(object sender, PropertyChangeEventArgs e) { // 同一のenum型かチェックする if (e.Key.GetType() == this.DataKey.GetType()) { if (this.DataKey.CompareTo(e.Key) == 0) { // Debug.WriteLine("同じenum = {0}", e.key); this.Method.DynamicInvoke(e.Latest, e); } else { // Debug.WriteLine("違うenum {0} != {1}", DataKey, e.key); } } }
/// <summary> /// イベントの発生<br/> /// </summary> /// <param name="e">データ変更イベントパラメーター</param><br/> /// <author>Takanori Shibuya.</author> protected virtual void OnPropertyChange(PropertyChangeEventArgs e) { if (this.Change != null) { this.Change(this, e); } }
/// <summary> /// プロパティ更新処理ハンドラー<br/> /// </summary> /// <param name="sender">イベント発生元</param> /// <param name="e">パラメーター</param> /// <author>Takanori Shibuya.</author> private void PropertyChangedHandler(object sender, PropertyChangedEventArgs e) { PropertyChangeEventArgs ne = new PropertyChangeEventArgs(); // 更新フラグ ne.Change = true; // キー ne.Key = ((IEntityNotifyProperty)sender).Key; // プロパティ名 ne.PropertyName = e.PropertyName; Type t = sender.GetType(); // 更新値 ne.Latest = t.InvokeMember(e.PropertyName, BindingFlags.GetProperty, null, sender, null); this.OnPropertyChange(ne); // イベント発火 }
/// <summary> /// データの格納<br/> /// INotifyPropertyChangedインターフェースを実装したクラスは<br/> /// 更新イベント発行対象外となる。更新イベントを発行する場合には<br/> /// クラス内で、PropertyChangedイベントを発行すること。<br/> /// </summary> /// <param name="key">データ格納キー</param><br/> /// <param name="value">格納データ</param><br/> /// <author>Takanori Shibuya.</author> public void SetValue(Enum key, object value) { if (value is IEntityNotifyProperty) { // IEntityNotifyPropertyインターフェースを実装したクラスは、更新でイベントの発行は行わない。 IEntityNotifyProperty ienp = (IEntityNotifyProperty)value; if (this.map.ContainsKey(key)) { // 既に同じデータキーで登録がある場合には、イベントハンドラーを付け替える。 IEntityNotifyProperty old = (IEntityNotifyProperty)this.map[key]; // イベントハンドラを解除 old.PropertyChanged -= this.PropertyChangedHandler; // イベントハンドラを再追加 ienp.PropertyChanged += new PropertyChangedEventHandler(this.PropertyChangedHandler); // キーを設定 ienp.Key = key; // 値を上書き this.map[key] = value; } else { // 新規にデータを格納する場合 // イベントハンドラを追加 ienp.PropertyChanged += new PropertyChangedEventHandler(this.PropertyChangedHandler); // キーを設定 ienp.Key = key; // キーと値を追加 this.map.Add(key, value); } } else { // 通常オブジェクトの設定では、更新イベントの発行は行われる。 PropertyChangeEventArgs e = new PropertyChangeEventArgs(); if (this.map.ContainsKey(key)) { // 更新 e.Change = true; // 変更前の値を退避 e.Old = this.map[key]; // 値を上書き this.map[key] = value; } else { // 新規登録 e.Change = false; // キーと値を追加 this.map.Add(key, value); } e.Key = key; e.Latest = value; // 値が更新された時だけイベントを発生する。 if (e.Old != null && e.Old.Equals(e.Latest) == false) { this.OnPropertyChange(e); // イベント発火 } else if (e.Latest != null && e.Latest.Equals(e.Old) == false) { this.OnPropertyChange(e); // イベント発火 } } }