我在Windows Phone 7.5及更高版本上处理一个项目(6页)目标。我不做纯MVVM模型,因为处理导航事件和查询字符串是如此痛苦,我决定逐一学习它,并首先完成项目:P
由于我是MVVM的新手,我决定不使用MVVM Light,自己编写所有样板代码。 当我完成每个部分的编码时,我遇到了一个问题。
绑定viewmodel的位置是最有效的。我经常阅读并总结以下几点。
在App.xaml.cs中创建Model实例作为属性,并在视图的代码隐藏中进行绑定。(这是官方Data Bound App示例的用法。)但是当面对很多时视图(6页等),这可能是一个问题。
public partial class App : Application
{
private static MainViewModel viewModel = null;
/// <summary>
/// A static ViewModel used by the views to bind against.
/// </summary>
/// <returns>The MainViewModel object.</returns>
public static MainViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
viewModel = new MainViewModel();
return viewModel;
}
}
}
将viewmodel的新实例作为视图后面代码中的全局变量。所以我可以在视图中使用它。 (如上所述,我不做纯MVVM)
在后面的代码中,在构造函数中,执行一次绑定。
public MainPage()
{
InitializeComponent();
myViewModel vm = new myViewModel();
DataContext = vm;
}
我读过使用ViewModelLocator作为中心站的mvvm灯。但是避免使用mvvm light,在哪里绑定viewmodel你们认为最好吗?
答案 0 :(得分:0)
MVVM只是一种模式,不使用纯mvvm就可以了。个人(最后这一切都归结为你的偏好)我认为选项3是理想的。
由于视图第一种方法,在Windows手机中尤其如此。我也不喜欢用视图模型混淆我的应用程序代码的想法。我认为背后的视图代码是设置和绑定视图模型的更自然的位置。一般来说,视图模型应该是视图的一个实例。例如,我不想让不同项目的详细信息页面共享一个详细视图模型,显然它们会显示相同的数据。虽然视图模型可以由多种类型的视图使用,但它通常不会用于多个视图实例。
我可以看到将这个放在应用程序代码中的唯一好处是您可以从任何地方访问您的视图模型实例。 VM“a”需要告诉vm“b”刷新。这在像这样的移动平台中并不常见,尽管我在拖放场景或子窗口中需要更多这样的东西。好消息是,如果您确实需要这些功能,您仍然不需要制作静态视图模型,您可以实现自己的功能,也可以只从mvvmlight中获取消息传递库。
我现在在wp市场上有4个应用程序,我在后面的代码中尝试了视图模型,因为我建议你和MVVM light和caliburn micro。希望这会有所帮助。
答案 1 :(得分:0)
ViewModelLocator模式不限于MVVMLight。对于此模式,您需要做的就是创建一个包含一组属性的类。这些属性中的每一个都将返回视图模型的实例。在App.xaml文件的资源部分中,您可以定义将创建此类实例的资源。然后,在您的视图中,将“Source”属性(DataContext的)设置为指向资源,例如, Source = {StaticResource ....}“,路径将是此StaticResource / Class实例上的属性名称。
在您的第一个示例中,您接近于遵循此模式。但是,您的App类充当ViewModelLocator,因为它暴露了视图模型的实例。与ViewModelLocator公开视图模型的实例的方式相同。不同之处在于您使用代码隐藏而不是使用XAML直接绑定到此App.Property。
最简单的选项是3.创建一个新实例并将其分配给数据上下文。但如果我是你,我会再次看一下ViewModelLocator模式。它实现了同样的目标,但它将视图模型的管理和生命周期与观点分开。
答案 2 :(得分:0)
我个人更喜欢在OnNavigatedTo
处理程序中创建ViewModel。
我发现这是最好的地方,因为在调用构造函数之后调用它并且它是导航参数可用的第一个地方。
显然你必须小心不要在向后导航时调用它(除非你的应用程序正在从墓碑中恢复) - 但这很容易检查。
这正是我在MvvmCross中使用的生命周期 - 在WindowsPhone和WindowsStore上的OnNavigatedTo
期间加载了ViewModel。
我也完全赞同@Paul的回答
一般来说,视图模型应该是视图的一个实例
我个人不喜欢看到ViewModel在单例,app对象等中持续存在 - 我每次创建一个View时都会创建一个ViewModel。