这就是我现在所拥有的:
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>
中移除此项。
我读了一些关于事件的内容,但不太清楚如何使其发挥作用。
答案 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
事件。