MVVM Light Toolkit设计方法(导航和视图加载)

时间:2011-06-06 11:07:58

标签: silverlight-4.0 mvvm mvvm-light mvvm-toolkit

我正在Silverlight中构建一个包含4-5个视图的简单应用程序。我遇到了MVVM Light工具包,我认为它符合我的需要。

背景

应用程序将具有典型列表和详细信息显示的视图

  • 制造商
  • 产品

等左侧导航,页眉和页脚(用户控件)。

我正在考虑在设计时创建一个包含用户控件的主页面。

问题

从左侧导航控件中选择链接时,应使用不同的视图(如制造商,产品等)更新中央面板

据我所知,Messenger是轻量级工具包中不同虚拟机之间进行通信的一种选择。

问题

如何使用MVVM light toolkit设计我的应用程序。中央窗格需要在运行时加载不同的视图。

我特别关注实现应用程序导航部分的帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

我必须以非mvvm的方式实现基本的nagivigtion。我有一个消息监听器坐在我的主视图的构造函数上,它监听页面导航消息(自定义消息学习它,喜欢它,使用它)然后它将导航框架的内容源设置为在信息。我使用字符串常量设置了所有页面和子页面导航的URL。

public MainPage()
        {
            InitializeComponent();
            Loaded += OnLoaded;
            WebContext.Current.Authentication.LoggedOut +=
                new EventHandler<System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationEventArgs>(Authentication_LoggedOut);
            Messenger.Default.Register<msgs.NavigationRequest<PageURI>>(this, (uri => ContentFrame.Navigate(uri.Content)));
            Messenger.Default.Register<WavelengthIS.Core.Messaging.ExceptionMessage>(this, ex => ShowExceptionMessage(ex));
            Messenger.Default.Register<WavelengthIS.Core.Messaging.StringMessage>(this, str => ShowMessageForUser(str));

        }


public class PageURI : Uri
    {
        public PageURI(string uriString, UriKind uriKind)
            : base(uriString, uriKind)
        {

        }


    }


public class PageLinks
    {
        public const string SEARCHBYDAYCOUNTVIEW = "/Views/PatientSearchHeaders/SearchByDayCountView.xaml";
        public const string SEARCHBYPATIENTCRITERIAVIEW = "/Views/PatientSearchHeaders/SearchByPatientCriteriaView.xaml";
        public const string QUESTIONAIRRESHELL = "/Views/QuestionairreViews/QuestionairreShell.xaml";
        public const string HOME = "/Views/PrimarySearchView.xaml";
        public const string REPORTS = "/Views/ReportsPage.xaml";
        public const string LOGINPAGE = "/Views/LoginPageView.xaml";
    }

虚拟机中的实际呼叫:

private void OnSurveyCommandExecute()
        {
            Wait.Begin("Loading Patient List...");
            _messenger.Send<ReadmitPatientListViewModel>(this);
            _messenger.Send<Messages.NavigationRequest<SubClasses.URI.PageURI>>(GetNavRequest_QUESTIONAIRRESHELL());

        }

        private static Messages.NavigationRequest<SubClasses.URI.PageURI> GetNavRequest_QUESTIONAIRRESHELL()
        {
            Messages.NavigationRequest<SubClasses.URI.PageURI> navRequest =
                new Messages.NavigationRequest<SubClasses.URI.PageURI>(
                    new SubClasses.URI.PageURI(Helpers.PageLinks.QUESTIONAIRRESHELL, System.UriKind.Relative));
            return navRequest;
        }