我认为这完全取决于用例。
当你有一个带有大量属性的简单模型时,你可以让它实现 INPC。简单来说,我的意思是这个模型看起来很像POCO。
如果您的模型更复杂并且存在于交互式模型域中 - 模型引用模型,订阅其他模型的事件 - 将模型事件实现为 INPC 是一场噩梦。
将自己置于某个必须与其他模型合作的模型实体的位置。您有各种要订阅的事件。它们都作为 INPC 实施。想象一下您拥有的那些事件处理程序。大量的 if 子句和/或 switch 子句。
INPC的另一个问题。您应该将您的应用程序设计为依赖于抽象,而不是实现。这通常使用接口来完成。
让我们看一下同一抽象的两种不同实现:
public class ConnectionStateChangedEventArgs : EventArgs
{
public bool IsConnected {get;set;}
}
interface IConnectionManagerINPC : INotifyPropertyChanged
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
bool IsConnected {get;}
}
interface IConnectionManager
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
bool IsConnected {get;}
}
现在看看他们两个。IConnectionManagerINPC 告诉你什么?它的某些属性可能会改变。你不知道他们中的哪一个。事实上,设计是只有 IsConnected 发生变化,因为其余的都是只读的。
相反,IConnectionManager 的意图很明确:“我可以告诉你,我的 IsConnected 属性的值可能会改变”。