如何在Windows Phone 8.1应用程序(xaml)中实现MVVM?

时间:2014-10-04 16:59:36

标签: windows-phone-8 mvvm windows-phone-8.1

有人能举例说明吗?它是通过实现INotifyPropertyChanged的ViewModel(以及在Silverlight中完成事件)或其他方式完成的吗? ViewModel如何绑定到视图?

到目前为止,我发现的所有示例都不完整或过时(请参阅Silverlight应用, Xaml应用)。

3 个答案:

答案 0 :(得分:4)

对于Windows RT,我建议考虑PRISM。它提供了非常好的现代开发实践。您将获得合适的导航服务,应用程序生命周期管理,出色的MVVM支持以及非常灵活的视图和ViewModels解析机制。 您可以通过NuGet轻松地将其添加到项目中。 它有很好的文档,所以如果您有任何问题,可以在MSDN上找到答案,甚至可以下载免费书籍Prism for the Windows Runtime。我们的团队在使用PRISM构建项目方面拥有成功经验。

答案 1 :(得分:3)

我目前在自己的Universal / W8.1 / WP8.1应用程序中使用以下方法。此方法使用RArcher WinRT Toolkit,这是一个基于MVVM模式的实验工具包。 它提供了一种维护应用状态的方法,您可以使用ViewModelBase来实现INPC。 它还使用Unity dependency injection container

我首先将ViewModelLocator作为应用程序范围的资源,因此我的视图可以轻松访问它。

<Application.Resources>
     <vm:ViewModelLocator x:Key="ViewModelLocator" />
</Application.Resources>

视图可以像这样使用它:

<Page.DataContext>
     <Binding Source="{StaticResource ViewModelLocator}" Path="MainViewModel" />
</Page.DataContext>

ViewModelLocator看起来像这样:

public sealed class ViewModelLocator
{
     public ViewModelLocator()
     {
         RegisterIoCBindings();
     }

     public IMainViewModel MainViewModel
     {
         get { return IocContainer.Get<IMainViewModel>(); }
     }

     private void RegisterIoCBindings()
     {
         IocContainer.Container.RegisterType(typeof(IMainViewModel), typeof(MainViewModel), 
         null, new ContainerControlledLifetimeManager());
     }
}

MainViewModelViewModelBase作为基类并实现IMainViewModel

public sealed class MainViewModel : ViewModelBase, IMainViewModel
{
     private string myText;
     [AutoState] 
     public string MyText
     {
         get { return myText; }
         set 
         { 
             myText = value;
             OnPropertyChanged();
         }
     }

     public MainViewModel() // You can use constructor injection here
     {             
     }
}

这是基本设置。正如其他人所说,MVVM是一种模式,有许多方法可以使用它。我会说,使用感觉良好的东西; - )

如果您想了解有关此方法的更多信息,请查看工具包和统一DI。

答案 2 :(得分:2)

没有区别,它是一样的。因为MVVM是一种模式。您可以轻松地将其实施到您的Windows Phone应用程序。我使用MVVM Light作为我的wp应用程序和EventToCommand行为来引发事件。我在[{3}}上开了一个应用程序,如果需要,可以查看。