Windows phone 7 MVVM Light:我在哪里从模型实例化一个类,如何更新/访问它?

Windows phone 7 MVVM Light:我在哪里从模型实例化一个类,如何更新/访问它?,windows-phone-7,navigation,viewmodel,mvvm-light,Windows Phone 7,Navigation,Viewmodel,Mvvm Light,现在,我正在开发我的第一个WP7应用程序,遇到了一些问题,尽管阅读了我在网上能找到的东西,我还是无法回答。请考虑一个有主页、参数页和结果页的应用程序。在参数页面中,用户可以在各种文本框中输入或更新数字。点击后退按钮将用户带回主页面,主页面上有一个名为“计算”的按钮。点击该按钮应获取数据,使用它执行计算,并将用户带到显示结果网格的结果页面 在一个名为Calculator.cs的文件中,我在一个名为Models的文件夹中有一个名为Calculator的类。我在ViewModels文件夹和相应的Mai

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

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

在此方面的任何帮助都将不胜感激

更新:有一些关于同一主题的更多信息。我可以进入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的字符限制。似乎有:

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

以下是我可能会用到的一个:

  • 按下计算按钮应触发导航至结果页面
  • 在导航到时,结果页面应显示一些动画(可能只是一个进度条)
  • 在导航到时,结果页面应创建一个新的ResultsViewModel,并将MainViewModel作为参数传入
  • ResultsViewModel的构造函数(或某些init方法)应该触发一个线程来进行计算
  • 完成此计算后,将设置ResultsViewModel的相关属性
  • 此时,结果页面上的数据绑定将清除动画并显示结果
其他解决方案肯定是可用的-将有兴趣阅读其他人的建议和偏好


另外,在你的结果页面上要注意的一件事是墓碑——这可能是一个有趣的挑战

谢谢你的想法。这给了我一些可以继续下去的东西。“将MainViewModel作为参数传递”是否意味着将其包含在URL中?或者是否有某种方法可以传递对象本身?此外,我意识到,在设置任何内容之前,我需要确保计算完成。Re:墓碑。除非用户更改了任何输入,否则我将尝试反序列化结果页面上进入网格模板的数据。我不想再计算了。我在iPhone上使用的一个相互竞争的应用程序每次都会这样做……需要10-15秒。我假设你的单一应用程序对象(app.Current)只拥有一个MainViewModel,你可以将其传递给ResultsViewModel*的构造函数。或者(我不是MVVMLight专家!)可能有某种方法可以向某些ViewModelResolver对象询问当前MainViewModel*如果您想要更多的可测试性,那么可能只需要传入接口指针,而不是整个对象。不要害怕编写一些代码,然后再对其进行重构-这是一个学习的好方法:)