从另一个类中触发事件

时间:2009-06-05 20:24:27

标签: c# .net vb.net

在.NET中,我有一个名为Caption的类。我有另一个名为Gauge的课程。在Gauge类中,我有一个定义为Caption的属性。

我想弄清楚如何执行以下操作: 当我在Caption类中更改某个属性时,如何让它在Gauge类中执行子程序?我想我必须声明一个事件和AddHandlers来解决它,但我想不出怎么做到这一点。

2 个答案:

答案 0 :(得分:2)

public class Caption
{
    private int myInt;

    public event EventHandler MyIntChanged;


    private void OnMyIntChanged()
    {
        var handler = this.MyIntChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
    public int MyInt
    {
        get
        {
            return this.myInt;
        }
        set
        {

            if (this.myInt != value)
            {
                this.myInt = value;
                this.OnMyIntChanged();
            }
        }
    }
}

现在,在你的语言课上:

public class Guage
{
    private Caption caption;

    public Caption Caption 
    {
        get
        {
            return this.caption;
        }
        set
        {
            if (this.caption!= value)
            {
                this.caption= value;
                this.caption.MyIntChanged += new EventHandler(caption_MyIntChanged);
            }
        }
    }

    private void caption_MyIntChanged(object sender, EventArgs e)
    {
       //do what you gotta do
    }
}

答案 1 :(得分:2)

您需要查看实现专门为此目的设计的INotifyPropertyChanged接口 - 在类实例的属性发生更改时引发事件。

this MSDN page上提供了一个很好的使用示例。

// This class implements a simple customer type 
// that implements the IPropertyChange interface.
public class DemoCustomer : INotifyPropertyChanged
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerName = String.Empty;
    private string companyNameValue = String.Empty;
    private string phoneNumberValue = String.Empty;

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerName = "no data";
        companyNameValue = "no data";
        phoneNumberValue = "no data";
    }

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    }

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
        get
        {
            return this.idValue;
        }
    }

    public string CompanyName
    {
        get {return this.companyNameValue;}

        set
        {
            if (value != this.companyNameValue)
            {
                this.companyNameValue = value;
                NotifyPropertyChanged("CompanyName");
            }
        }
    }
    public string PhoneNumber
    {
        get { return this.phoneNumberValue; }

        set 
        {
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                NotifyPropertyChanged("PhoneNumber");
            }
        }
    }
}