Click here to Skip to main content
15,885,767 members
Articles / Programming Languages / C#

Migrate from Basic to MVVM and MEF Composable Patterns for a Silverlight Application - Part 3

Rate me:
Please Sign up or sign in to vote.
5.00/5 (4 votes)
3 May 2012CPOL12 min read 24.7K   464   9  
The article series shows how to upgrade a Silverlight application having basic patterns to the MVVM and MEF composable patterns with easy approaches and detailed coding explanations.
using System;
using System.Linq;
using System.Windows.Controls;
using System.ComponentModel;
using System.ComponentModel.Composition;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Messaging;
using ProductApp.Common;

namespace ProductApp.Main.ViewModels
{
    [Export(typeof(IModule)), ExportMetadata(MetadataKeys.Name, ModuleID.MainPageViewModel)]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class MainPageViewModel : ViewModelBase, IModule
    {
        private ModuleCatalogService _catalogService = ModuleCatalogService.Instance;
        private string _currentViewText = string.Empty;

        public MainPageViewModel()
        {            
        }

        // Defined with string type to pass the command parameter
        private RelayCommand<string> _loadModuleCommand;
        //
        public RelayCommand<string> LoadModuleCommand
        {
            get
            {
                if (_loadModuleCommand == null)
                {
                    // Parameter 1: define a delegate method to be executed
                    // Parameter 2: the delegate function CanExedute
                    // with one-in(object) and one-out(bool) parameters
                    // to make the command enabled or disabled
                    _loadModuleCommand = new RelayCommand<string>(
                                  OnLoadModuleCommand,
                                  moduleId => moduleId != null);
                }
                return _loadModuleCommand;
            }
        }
        //
        private void OnLoadModuleCommand(String moduleId)
        {
            string xapUri;
            try
            {
                if (_currentViewText != moduleId)
                {
                    // For loading Xap or View
                    switch (moduleId)
                    {
                        // Load ProductApp.Xap on-demand
                        case ModuleID.ProductListView:
                            xapUri = "/ClientBin/ProductApp.Views.xap";
                            _catalogService.AddXap(xapUri, arg => ProductApp_OnXapDownloadCompleted(arg));
                            break;
                        
                        default:
                            throw new NotImplementedException();
                    }
                }
            }
            catch (Exception ex)
            {
                // Pass error object to View code-behind
                Messenger.Default.Send(ex, MessageToken.RaiseErrorMessage);
            }
        }

        private void ProductApp_OnXapDownloadCompleted(AsyncCompletedEventArgs e)
        {
            // Send message back to View code-behind to load ProductList View
            Messenger.Default.Send(ModuleID.ProductListView, MessageToken.LoadScreenMessage);

            // Cache for check repeat commands later
            _currentViewText = ModuleID.ProductListView;
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
Shenwei is a software developer and architect, and has been working on business applications using Microsoft and Oracle technologies since 1996. He obtained Microsoft Certified Systems Engineer (MCSE) in 1998 and Microsoft Certified Solution Developer (MCSD) in 1999. He has experience in ASP.NET, C#, Visual Basic, Windows and Web Services, Silverlight, WPF, JavaScript/AJAX, HTML, SQL Server, and Oracle.

Comments and Discussions