Клонирование и события
От: Аноним  
Дата: 25.06.10 07:53
Оценка:
Есть некий редактор свойств объекта.
Для того чтобы по нажатию на Esc объект не менялся, я редактору отдаю клон объекта:


SomeClass class1 = new SomeClass(); // where SomeClass : INotifyPropertyChanged,  ICloneable, IDisposable
SomeClass clone = class1.Clone();

if(PropertyEditor.Edit(clone))
{
 class1 = clone;
}


В итоге:
1. При нажатии на Ок, свойства class1 остаются неизменными
2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

Что я делаю не так?
Re: Клонирование и события
От: _FRED_ Черногория
Дата: 25.06.10 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

А>Что я делаю не так?

Не показываете, как реализованы события и клонирование.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Клонирование и события
От: Аноним  
Дата: 25.06.10 08:34
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


А>>2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

А>>Что я делаю не так?

_FR>Не показываете, как реализованы события и клонирование.


Есть некий класс-слушатель, у которого есть несколько объектов для прослушивания:

BaseClass baseClass
{
  SomeClass class1;
  public baseClass()
  {
     class1 = new SomeClass();
     class1.PropertyChanged+=.........
  }

}




А клонирование у SomeClass реализовано так:

#region ICloneable Members

        public object Clone()
        {
            return this.MemberwiseClone();
        }
#endregion
Re: Клонирование и события
От: TK Лес кывт.рф
Дата: 25.06.10 09:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1. При нажатии на Ок, свойства class1 остаются неизменными

А>2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

А>Что я делаю не так?


У клонированного объекта надо очистить список подписчиков. В оптимистичном варианте надо у клонированного объекта вызвать Events.Dispose()
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Клонирование и события
От: cadet354 Россия
Дата: 25.06.10 10:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, _FRED_, Вы писали:


_FR>>Здравствуйте, Аноним, Вы писали:


А>>>2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

А>>>Что я делаю не так?

как реализовано INotifyPropertyChanged?
Re[3]: Клонирование и события
От: _FRED_ Черногория
Дата: 25.06.10 11:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

А>>>Что я делаю не так?
_FR>>Не показываете, как реализованы события и клонирование.
А>Есть некий класс-слушатель, у которого есть несколько объектов для прослушивания:
А>BaseClass baseClass
А>{
А>  SomeClass class1;
А>  public baseClass()
А>  {
А>     class1 = new SomeClass();
А>     class1.PropertyChanged+=.........
А>  }

А>}

А>А клонирование у SomeClass реализовано так:
А>        public object Clone()
А>        {
А>            return this.MemberwiseClone();
А>        }


Вы в курсе, что это не глубое клонирование? Например, если в SomeClass есть поля ссылочного типа, то они не будут склонированны? Собственно, это и происходит с делегатами. Если хочется побыстрее как-нить заткнуть, то можно так:

public object Clone()
{
  var clone = (SomeClass)MemberwiseClone();
  clone.PropertyChanged = null; // Если PropertyChanged - field-like событие.
  return clone;
}
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Клонирование и события
От: Аноним  
Дата: 25.06.10 11:45
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Здравствуйте, <Аноним>, Вы писали:


А>>Здравствуйте, _FRED_, Вы писали:


_FR>>>Здравствуйте, Аноним, Вы писали:


А>>>>2. Почему то при редактировании клона приходят события тому объекту, который подписан на class1.PropertyChanged

А>>>>Что я делаю не так?

C>как реализовано INotifyPropertyChanged?



  #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string PropertyName)
        {
            if ((this.PropertyChanged != null))
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }
 #endregion
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.