在c#入门经典中有这样一个例子
如果要给控件ControlA添加一个AStringProperty,让另一个控件ControlB响应对该属性的改动,就必须执行如下步骤:
(1)给控件ControlA添加AStringProperty属性,例如
private string aStringProperty; public string AStringProperty
{
get
{
return aStringProperty;
}
set
{
aStringProperty=value;
}
}
(2)给ControlA添加一个事件
(3)给ControlA添加一个方法,来引发事件。
(4)在ControlA中为AStringProperty的set访问器添加代码,以调用事件,引发方法。
(5)给ControlB添加代码,以订阅ControlA中的事件。题目大概就是这样的,一直对于使用事件和委托改变另外个类中的属性不太清楚,请各位根据这个题目,写些相关的代码参考参考。
如果要给控件ControlA添加一个AStringProperty,让另一个控件ControlB响应对该属性的改动,就必须执行如下步骤:
(1)给控件ControlA添加AStringProperty属性,例如
private string aStringProperty; public string AStringProperty
{
get
{
return aStringProperty;
}
set
{
aStringProperty=value;
}
}
(2)给ControlA添加一个事件
(3)给ControlA添加一个方法,来引发事件。
(4)在ControlA中为AStringProperty的set访问器添加代码,以调用事件,引发方法。
(5)给ControlB添加代码,以订阅ControlA中的事件。题目大概就是这样的,一直对于使用事件和委托改变另外个类中的属性不太清楚,请各位根据这个题目,写些相关的代码参考参考。
{
static void Main(string[] args)
{
var a = new ControlA(); var b = new ControlB(a); a.Name = "good";
a.Name = "bad";
Console.ReadLine();
}
} class PropertyChangedEventArgs<T> : EventArgs
{
public PropertyChangedEventArgs(T oldValue, T newValue)
{
OldValue = oldValue;
NewValue = newValue;
} public T OldValue { get; private set; } public T NewValue { get; private set; }
} class ControlA
{
public event EventHandler<PropertyChangedEventArgs<string>> NameChanged; private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
if (NameChanged != null)
NameChanged(this, new PropertyChangedEventArgs<string>(name, value));
name = value;
}
}
} class ControlB
{
public ControlB(ControlA subject)
{
subject.NameChanged += new EventHandler<PropertyChangedEventArgs<string>>(subject_NameChanged);
} void subject_NameChanged(object sender, PropertyChangedEventArgs<string> e)
{
Console.WriteLine("Name本来是{0},现在变成了{1}", e.OldValue, e.NewValue);
}
}希望对你有帮助
class Program
{
static void Main(string[] args)
{
var a = new ControlA(); var b = new ControlB(a); a.Name = "good";
a.Name = "bad";
Console.WriteLine(a.Name);
Console.ReadLine();
}
} class PropertyChangedEventArgs<T> : EventArgs
{
public PropertyChangedEventArgs(T oldValue, T newValue)
{
OldValue = oldValue;
NewValue = newValue;
} public T OldValue { get; private set; } public T NewValue { get; private set; }
} class ControlA
{
public event EventHandler<PropertyChangedEventArgs<string>> NameChanged; private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
/*if (NameChanged != null)
NameChanged(this, new PropertyChangedEventArgs<string>(name, value));*/
name = value;
}
}
} class ControlB
{
public ControlB(ControlA subject)
{
subject.NameChanged += new EventHandler<PropertyChangedEventArgs<string>>(subject_NameChanged);
} void subject_NameChanged(object sender, PropertyChangedEventArgs<string> e)
{
Console.WriteLine("Name本来是{0},现在变成了{1}", e.OldValue, e.NewValue);
}
}
结果任然是一样的。
题目是说在ControlB中修改A的属性。
{
static void Main(string[] args)
{
var a = new ControlA(); var b = new ControlB(a); a.Name = "good";
a.Name = "bad";
Console.WriteLine(a.Name);
Console.ReadLine();
}
} class PropertyChangedEventArgs<T> : EventArgs
{
public PropertyChangedEventArgs(T oldValue, T newValue)
{
OldValue = oldValue;
NewValue = newValue;
} public T OldValue { get; private set; } public T NewValue { get; private set; }
} class ControlA
{
public event EventHandler<PropertyChangedEventArgs<string>> NameChanged; private string name;
public string Name
{
get { return name; }
set
{
if (name == value)
return;
/*if (NameChanged != null)
NameChanged(this, new PropertyChangedEventArgs<string>(name, value));*/
name = value;
}
}
} class ControlB
{
public ControlB(ControlA subject)
{
subject.NameChanged += new EventHandler<PropertyChangedEventArgs<string>>(subject_NameChanged);
} void subject_NameChanged(object sender, PropertyChangedEventArgs<string> e)
{
Console.WriteLine("Name本来是{0},现在变成了{1}", e.OldValue, e.NewValue);
}
}
{
subject.NameChanged += new EventHandler<PropertyChangedEventArgs<string>>(subject_NameChanged);
subject.Name="abc";
}
不就可以了?现实情况中,可能是这么创建ControlB的:
var b=ControlB(new ControlA())
只有b持有ControlA,所以只能由B改。(而不是在先前例子中的在Main里面改)其次,我知道Control是控件的意思,会跟用户交互。如果ControlB是一个按钮,按钮按下时设置subject.Name="abc",然后经由NameChanged,再通知到ControlB。在这种情境下,即B改A,A再通知B,是没什么意义的。不如直接
Console.WriteLine("Name本来是{0},现在变成了{1}", subject.Name, "abc");
subject.Name="abc";
var a=ControlA();
var b1=new ControlB(a);
var b2=new ControlB(a);b1、b2都订阅a.NameChanged事件,那么b1设置subject.Name="abc",b2也能收到通知。