c# - 需要从 View 调用 VIewModel 的方法

标签 c# .net mvvm

你好
我想知道这种方法是否正确,或者什么应该是正确的
我有一个 MVVM 模式,我有一个 ListView
我的想法是,当我在 ListView 中选择一个项目时, View 模型中的一个属性会使用所选对象进行更新。但是,当用户按下 Intro 时,我希望 viewmodel 做一些事情(打开一个新的浏览器窗口)。我做了这样的事情:

private void listView1_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            var vm = Resources["Locator"] as MainViewModel;

            if (listView1.SelectedIndex != -1 && e.Key == Key.Enter)
            {
                vm.OpenBrowserForSelectedOffer();
            }
        }

但是,我不知道这是否是把事情做好的正确方法,或者是否应该做其他事情。因为在这种情况下, View 实际上是在请求 View 模型(这是一种资源),也许它“知道太多”,并且有更好的做法来解决这类问题。

最佳答案

我假设您使用的是 WPF 或 Silverlight。使用命令模式当然是执行由 UI 事件触发的命令的正确方法。但是,问题在于,在您的情况下,此操作本身会对 UI 产生影响;这不是 View 模型的责任。

它可以通过简单的方式解决,以便 View 模型保持可测试性。创建一个 IBrowserService 接口(interface),使用 OpenBrowserForOffer 操作。

public void OpenBrowserForOffer(Offer offer, Action<Result> callback)

创建一个打开浏览器并显示所选商品的实现。创建另一个没有 UI 内容的模拟实现。

然后从 View 模型中,注入(inject)一个 IBrowserService 实例,并使用它来打开浏览器或执行模拟逻辑,具体取决于从实际应用程序或测试中运行。

请注意,在 View 中,您可以使用 DataContext 来获取 View 模型。

关于c# - 需要从 View 调用 VIewModel 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4449460/

相关文章:

c# - 重复控制 n 次并绑定(bind)每个实例

wpf - ComboBox和 Entity Framework ,如何获取ID? (WPF-MVVM)

c# - 如何从 DbProviderFactories 中删除提供者?

java - 使用IKVM生成dll文件时如何添加对资源文件夹的引用

c# - unity PerThreadLifetimeManager 和任务

c# - 如何在 asmx Web 服务(wsdl)中操作端口类型?

c# - 如何在 C# 中追加 xml 文件?

wpf - 为 RelativeSource 绑定(bind)定义混合表达式 ViewModel 定义

java - YamlDotNet:如何处理!!set

c# - C# IHttphandler 上 jQuery 自动完成的随机排序请求