C#如果项目引发事件

时间:2016-07-20 08:09:55

标签: c# events

这就是我现在所拥有的:

class MyClass
{
    public string status;

    private void DoSomething()
    {
        // do something and make change to this.status;
    }
}

class MyClass2
{
    public List<MyClass> MyClassLst;

    private void DetectChangeInList()
    {
        // if the status property of an item in this.MyClassLst changed, remove this item from list
    }
}

我有一个List<MyClass>,每个MyClass都会做一些工作并更改属性status。我想检测MyClass中是否有任何status更改了MyClassLst,并从 <div class="row"> <button ng-disabled="!((Interview.InterviewAccepted || Interview.AlternateAccepted) && (Interview.InterviewAccepted != Interview.AlternateAccepted) )" class="btn btn-success" ng-click="AcceptInterview(DemoForm)"> Accept </button> </div> 中移除此项。

我读了一些关于事件的内容,但不太清楚如何使其发挥作用。

1 个答案:

答案 0 :(得分:0)

如果您需要收到有关每个MyClass个实例的各个属性更改的通知,那么这不是可能神奇地发生的事情。

你的MyClass必须负责在事情发生变化时触发事件(通常是PropertyChanged event,即INotifyPropertyChanged接口),而另一个类必须附加一个处理程序到列表中的每个项目以获得通知。

C#6有一些语法上的改进,可以简化这一点,但是你仍然需要为每个属性做很多工作:

public class Model : INotifyPropertyChanged
{
    // this is the event which gets fired
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    // you need to raise the event in each property's setter
    private _someValue;
    public string SomeValue
    {
        get { return _someValue; }
        set { if (value != _someValue) { _someValue = value; OnPropertyChanged(); } }
    }

    private _anotherVal;
    public string AnotherValue
    {
        get { return _anotherVal; }
        set { if (value != _anotherVal) { _anotherVal = value; OnPropertyChanged(); } }
    }
}

在你的情况下,它将是:

public class MyClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    // Never use public fields! 
    // Status should be a property which gets and sets
    // the actual private backing field (_status).

    private _status;
    public string Status
    {
        get { return _status; }
        set { if (value != _status) { _status = value; OnPropertyChanged(); } }
    }
}

您也很可能希望将List<MyClass>更改为您自己的ICollection<T>实现,它会在您添加或删除项目时附加和分离这些处理程序。它通常通过派生Collection<T>并覆盖相关方法来完成。如果您对此不满意,稍微简单的方法可能是将列表设为私有,并公开Add / Remove和类似的方法,您将附加/分离到PropertyChanged事件。