在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中的事件。题目大概就是这样的,一直对于使用事件和委托改变另外个类中的属性不太清楚,请各位根据这个题目,写些相关的代码参考参考。

解决方案 »

  1.   

    很简单的问题呃。。    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);
            }
        }希望对你有帮助
      

  2.   

    根据你的意思,貌似不需要用到事件都能改变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的属性。
      

  3.   

    不好意思,上面那段代码看的可能有点头痛,我这里重新贴下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);
            }
        }
      

  4.   

    首先关于是否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";
      

  5.   

    或者ControlB有两个实例
    var a=ControlA();
    var b1=new ControlB(a);
    var b2=new ControlB(a);b1、b2都订阅a.NameChanged事件,那么b1设置subject.Name="abc",b2也能收到通知。
      

  6.   

    这种通知来通知去的逻辑,应该用绑定(binding)。