如何知道哪个视图正在访问 ViewModel Silverlight MVVM
本文关键字:访问 ViewModel Silverlight MVVM 何知道 视图 | 更新日期: 2023-09-27 18:32:12
我正在开发一个带有MVVM模式的Silverlight应用程序。虽然不建议将一个视图模型用于多个视图,但就我而言,我必须这样做以实现代码可重用性。无论如何,视图模型的构造函数执行一些数据访问,这只应该针对特定视图而不是其余视图完成。 在 ViewModel 构造函数中是否有一种方法可以看到哪个视图请求了此视图模型实例?
向视图模型的构造函数注入一个接口,该接口将包含所需的信息。在视图中实现接口。无论哪个类构造视图模型和视图,都需要将视图实例传递给视图模型。如果您使用的是 DI 容器,则必须创建某种包装器,该包装器将知道如何正确创建视图模型并将视图注入其中。
这不是一个非常错误的设计,有时它是在MVVM中做事的唯一方法。只要做得好,你就会没事的。
您的最后一条语句(即突出显示的语句)表明您没有执行正确的 MVVM...视图应该在响应视图模型的创建时实例化,而不是相反。我还发现很难想象将多个视图映射到视图模型的情况是有利的,更不用说实际需要了......为什么不能只使用数据触发器来设置单个视图的模板?
回答你的问题,虽然实际上可以做到。如果首先创建视图模型,则为其提供命令处理程序,并为您的视图提供一个交互触发器,该触发器调用命令以响应其"Loaded"事件,以及标识视图的相应 CommandParameter。
另一方面,如果您首先创建视图并通过定位器绑定 DataContext,则需要通过 ObjectDataProvider 进行绑定,以便可以调用方法并传入视图的标识数据:
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<ObjectDataProvider ObjectInstance="{StaticResource Locator}" MethodName="GetViewModel" x:Key="MyProvider">
<ObjectDataProvider.MethodParameters>
<system:String>My parameter</system:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
视图的 DataContext 绑定现在将如下所示:
DataContext="{StaticResource MyProvider}"
当然,您需要将函数添加到定位器中:
public MyViewModel GetViewModel(string id)
{
// create an instance of MyViewModel here, passing id into the constructor
}
虽然这些在技术上回答了你的问题,但我必须强调,它们都是可怕的黑客,如果你正确地遵守MVVM模式,你真的不需要这样做。