Пример #1
0
 /// <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);
         }
     }
 }
Пример #2
0
 /// <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);
     }
 }
Пример #3
0
        /// <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);    // イベント発火
        }
Пример #4
0
        /// <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);    // イベント発火
                }
            }
        }