【问题标题】:MVVM Light: Where do I instantiate a class from a model and how do I update/access it?MVVM Light:我在哪里从模型中实例化一个类以及如何更新/访问它?
【发布时间】:2011-01-31 17:28:34
【问题描述】:

现在,我正在开发我的第一个 WP7 应用程序并遇到了一些问题,尽管阅读了我可以在网上找到的内容,但我无法回答这些问题。请考虑一个具有主页、参数页面和结果页面的应用程序。在参数页面中,用户可以在各种文本框中输入或更新数字。点击后退按钮将用户带回主页,那里有一个名为“计算”的按钮。点击该按钮应该获取数据,对其进行计算,然后将用户带到结果页面,显示一个带有结果的网格。

在一个名为 Calculator.cs 的文件中,我在一个名为 Models 的文件夹中有一个名为 Calculator 的类。我在 ViewModels 文件夹中还有我的 MainViewModel.cs、ParametersViewModel.cs 和 ResultsViewModel.cs 文件以及对应的 MainPage.xaml,以及在名为 Views 的文件夹中的 Parameters.xaml 和 Results.xaml。我假设所有数据都将在 Calculator 类的实例中进行操作,然后将返回一个结果集并将其定向到 Results.xaml。我不知道在哪里实例化 Calculator 类,传递数据,然后检索结果。我也有些疑惑,计算完成后如何触发自动导航到结果页面。

对此的任何帮助将不胜感激。

更新:Passing a complex object to a page while navigating in a WP7 Silverlight application 有更多关于同一主题的信息。我可以进入 App.xaml.cs 并添加如下内容:

public class Foobar
{
    public string barfoo = "hah!";
}

public static Foobar myfoob = new Foobar();

然后从 ViewModel 页面访问它,例如AboutViewModel.cs,像这样:

public AboutViewModel()
{
    string goo = App.myfoob.barfoo;
}

但在这一点上,我仍然不确定这可能会产生什么不可预见的影响。我将在这一点上解决序列化/墓碑问题,看看使用这种方法或跨页面使用相同的 DataContext 会发生什么。否则,上面链接中的一张海报提到序列化参数并在页面之间传递它们。我担心 HTTP GET 是否有字符限制。好像有:URI Limits in Silverlight

【问题讨论】:

    标签: windows-phone-7 navigation viewmodel mvvm-light


    【解决方案1】:

    当然有很多可能的设计——其中很多在不同的方面都是正确的!

    这是我可能使用的一个:

    • 按下“计算”按钮应触发“导航到结果”页面
    • 在导航到时,结果页面应该显示一些动画(可能只是一个进度条)
    • 在导航到时,结果页面应该创建一个新的 ResultsViewModel,并将 MainViewModel 作为参数传递
    • ResultsViewModel 的构造函数(或一些 init 方法)应该启动一个线程来进行计算
    • 此计算完成后,ResultsViewModel 的相关属性将被设置
    • 此时结果页面上的数据绑定将清除动画并显示结果

    其他解决方案肯定是可用的 - 有兴趣阅读其他人的建议和偏好。

    顺便说一句,在您的结果页面上要注意的一件事是墓碑 - 可能是一个有趣的挑战!

    【讨论】:

    • 感谢您对此的想法。这给了我一些继续下去的机会。 “将 MainViewModel 作为参数传递”是指将它们包含在 URL 中吗?或者有什么方法可以传递对象本身?
    • 另外,我意识到在设置任何内容之前我需要确保计算完成。
    • 回复:墓碑。除非用户更改了任何输入,否则我将尝试仅反序列化将进入结果页面上的网格模板的数据。我不想再次运行计算。我在 iPhone 上使用的竞争应用程序每次都会这样做……需要 10-15 秒。
    • 我假设您的 Singleton App 对象 (App.Current) 将只拥有一个 MainViewModel - 您可以将其传递给 ResultsViewModel* 的构造函数。或者(我不是 MVVMLight 大师!)可能有一些方法可以向某些 ViewModelResolver 对象询问当前的 MainViewModel。 *如果你想要更多的可测试性,那么也许只传递接口指针而不是整个对象。
    • 不要害怕编码一些东西然后再重构它——这是学习的好方法:)
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多