c#入门经典里的一个例子

VickyD1023 2012-01-06 08:07:19
在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中的事件。

题目大概就是这样的,一直对于使用事件和委托改变另外个类中的属性不太清楚,请各位根据这个题目,写些相关的代码参考参考。
...全文
139 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
VickyD1023 2012-01-07
  • 打赏
  • 举报
回复
懂了。万分感谢
gqqnb 2012-01-06
  • 打赏
  • 举报
回复
这种通知来通知去的逻辑,应该用绑定(binding)。
gqqnb 2012-01-06
  • 打赏
  • 举报
回复
或者ControlB有两个实例
var a=ControlA();
var b1=new ControlB(a);
var b2=new ControlB(a);

b1、b2都订阅a.NameChanged事件,那么b1设置subject.Name="abc",b2也能收到通知。
gqqnb 2012-01-06
  • 打赏
  • 举报
回复
首先关于是否if (NameChanged != null)是否必要的问题,你自己尝试下注释掉subject.NameChanged += new EventHandler<PropertyChangedEventArgs<string>>(subject_NameChanged);

要说在ControlB中修改ControlA,在我的代码里

public ControlB(ControlA subject)
{
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";
VickyD1023 2012-01-06
  • 打赏
  • 举报
回复
不好意思,上面那段代码看的可能有点头痛,我这里重新贴下

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);
}
}
VickyD1023 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gqqnb 的回复:]

很简单的问题呃。。

C# code
class Program
{
static void Main(string[] args)
{
var a = new ControlA();

var b = new ControlB(a);

a.Name = "good";……
[/Quote]
根据你的意思,貌似不需要用到事件都能改变ControlA的属性了。我对代码做了如下修改
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的属性。
gqqnb 2012-01-06
  • 打赏
  • 举报
回复
很简单的问题呃。。

    class Program
{
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);
}
}


希望对你有帮助

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧