вторник, июня 22, 2004

На заметку - наблюдение за классом

Можно ли как-то со стороны одного экземпляра следить за состоянием другого экземпляра? Например, есть класс A у которого есть свойство P1 и класс B, который должен как-то узнавать обо всех изменениях A.P1. При этом, чтобы сам класс A ничего не подозревал о том, что за ним «наблюдают»?

public class A
{
public string P1
{
get {return this._P1;}
set
{
this._P1 = value;
}
}
private string _P1 = string.Empty;
}

> ... чтобы сам класс A ничего не подозревал о том, что за ним «наблюдают» ...
Если я правильно понимаю, это значит, что в самом классе A ничего не меняется

> ... класс B, который должен как-то узнавать обо всех изменениях A.P1
Это можно сделать:

A a = new A();
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(a);
pdc["P1"].AddValueChanged(this.a, new EventHandler(A_ValueChanged));

private void A_ValueChanged(object sender, EventArgs e)
{
MessageBox.Show("sss");
}

Теперь вызываем изменение свойства
a.P1 = "str"; // это не приведет к вызову обработчика.

Для того, чтобы все заработало, свойство A.P1
следует менять след. образом:

PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(a);
pdc["P1"].SetValue(this.a, "D6");

Кстати, PropertyGrid скорее всего таким способом меняет
значения свойств у объектов:

PropertyGrid p = new PropertyGrid();
p.Parent = this;
p.Dock = DockStyle.Fill;
p.SelectedObject = this.a;

Изменение свойства this.a.P1 из PropertyGrid также
приводит к вызову A_ValueChanged


Отправить комментарий