在理想的 MVVM 实现中,没有更好或替代的地方,因为您不太可能知道视图何时或如何与视图模型通信。事实上,视图模型不应该对视图有任何了解。视图可能是 Silverlight UI 或控制台应用程序,或测试模型,或其他任何东西。根据当时的一般想法,构造函数似乎是唯一应该禁用“更改跟踪”的地方。
如果您尝试严格遵循 MVVM,您应该接受您的视图模型作为主要对象和视图作为次要对象。我的意思是视图不应该引入任何与特定视图实现无关的逻辑。它只显示当前视图模型状态并将用户的操作传达给视图模型。如果这是真的,那么除了构造函数之外,您不需要关闭更改跟踪。
当然,在现实世界中,这可能很难遵循。如果您找不到其他解决方案,您可以向视图模型引入额外的属性,例如IsViewInitialized
,这将打开“更改跟踪”,并使视图根据需要设置属性。
但你最好尽可能避免这种情况。这种方法增加了视图和视图模型之间的耦合,这违背了 MVVM 模式的主要思想之一。
如果您亲自问我,我的视图模型很少有用于初始化步骤的替代逻辑,如果有,则仅在构造函数中。而且我通常不会“关闭更改跟踪”,而是直接设置一些字段来绕过在大多数情况下驻留在属性设置器中的常规更改跟踪代码。但有时即使在构造函数中触发某些属性的逻辑会更方便。