如何知道哪个View正在访问ViewModel Silverlight MVVM

时间:2014-11-27 16:38:15

标签: c# wpf silverlight mvvm

我正在使用MVVM模式处理Silverlight应用程序。虽然不建议对一个以上的视图使用一个视图模型,但在我的情况下,我必须为代码可重用性而这样做。无论如何,viewmodel的构造函数执行一些数据访问,这只能用于特定视图而不是其他视图。 在ViewModel构造函数中是否有一种方法可以看出哪个View已请求ViewModel的这个实例?

2 个答案:

答案 0 :(得分:1)

向视图模型的构造函数注入一个接口,该构造函数将包含所需的信息。在视图中实现接口。无论哪个类构建视图模型,视图都需要将视图实例传递给视图模型。如果您正在使用DI容器,则必须创建某种包装器,该包装器将知道如何正确创建视图模型并将视图注入其中。

这不是一个非常错误的设计,有时它是在MVVM中做事的唯一方法。只要做得恰到好处,你就没事了。

答案 1 :(得分:0)

你的最后一句话(即突出显示的那句)暗示你没有做正确的MVVM ...应该实例化视图以响应视图模型的创建,而不是反过来。我还发现很难设想将多个视图映射到视图模型的情况是有利的,更不用说实际需要了......为什么你不能只使用数据触发器来设置单个视图的模板?

尽管实际上可以做到,但要回答你的问题。如果首先创建视图模型,则给它一个命令处理程序,并为视图提供一个交互触发器,该触发器调用命令以响应它的“已加载”事件,以及标识视图的相应CommandParameter。

另一方面,如果您首先创建视图并通过定位器绑定DataContext,那么您需要通过ObjectDataProvider进行绑定,以便您可以调用方法并传入视图的标识数据: / p>

<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模式,它们都是你真正不应该做的可怕的黑客攻击。