gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:53:00 25 4
gpt4 key购买 nike

你好
我想知道这种方法是否正确,或者什么应该是正确的
我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com