【问题标题】:How to know which View is accessing the ViewModel Silverlight MVVM如何知道哪个 View 正在访问 ViewModel Silverlight MVVM
【发布时间】:2014-11-27 16:38:15
【问题描述】:

我正在使用 MVVM 模式开发 Silverlight 应用程序。虽然不建议将一个视图模型用于多个视图,但就我而言,我必须这样做是为了代码的可重用性。无论如何,viewmodel 的构造函数会执行一些数据访问,这些数据访问应该只针对特定视图而不是其余视图。 在 ViewModel 构造函数中是否有一种方法可以让我看到哪个 View 请求了这个 ViewModel 实例?

【问题讨论】:

  • 这取决于您如何实例化您的视图模型,但一般来说,没有......视图模型不应该知道任何关于视图的信息。正确地遵循模式,你的问题就会消失。

标签: c# wpf silverlight mvvm


【解决方案1】:

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

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

【讨论】:

  • 一个非常错误的设计。他说他只想重用代码,因此两次使用相同的 vm 类型,因此正确的做法是将可重用部分提取到自己的类型中并使用组合。
  • @Martin:用粗体字阅读问题
【解决方案2】:

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

要回答您的问题,尽管实际上是可以做到的。如果您的视图模型首先被创建,那么给它一个命令处理程序并给您的视图一个交互触发器,该触发器调用命令以响应它的“加载”事件,以及一个标识视图的适当命令参数。

另一方面,如果您首先创建视图并通过定位器绑定 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 模式,它们都是可怕的黑客行为,您真的不需要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 2012-06-22
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2015-07-21
    • 2019-10-16
    • 2013-08-29
    相关资源
    最近更新 更多