- MigrateToMvvmMef-Part3_Src.zip
- MigrateToMvvmMef-Part3_Src
- _Assemblies
- GalaSoft.MvvmLight.SL5.dll
- System.Windows.Interactivity.dll
- AnotherXap.Models
- AnotherXap.ViewModels
- AnotherXap.Views
- ProductApp.Common
- Bin
- Release
- Constants
- EventArguments
- Models
- ModuleServices
- obj
- ProductApp.Common.csproj
- ProductApp.Common.csproj.user
- Properties
- SaveState
- ProductApp.Main
- ProductApp.Models
- ProductApp.sln
- ProductApp.suo
- ProductApp.ViewModels
- ProductApp.Views
- ProductApp.Web
- ProductRiaLib.Web
- ProductRiaLib
- Readme.txt
- MigrateToMvvmMef-Part1_Src.zip
- MigrateToMvvmMef-Part1_Src
- ProductApp.Common
- ProductApp.Main
- ProductApp.sln
- ProductApp.suo
- ProductApp.Views
- ProductApp.Web
- ProductRiaLib.Web
- ProductRiaLib
- Readme.txt
- MigrateToMvvmMef-Part2_Src.zip
- MigrateToMvvmMef-Part2_Src
- _Assemblies
- GalaSoft.MvvmLight.SL5.dll
- System.Windows.Interactivity.dll
- ProductApp.Common
- Bin
- Release
- Constants
- EventArguments
- Models
- ModuleServices
- obj
- ProductApp.Common.csproj
- ProductApp.Common.csproj.user
- Properties
- ProductApp.Main
- ProductApp.Models
- ProductApp.sln
- ProductApp.suo
- ProductApp.ViewModels
- ProductApp.Views
- ProductApp.Web
- ProductRiaLib.Web
- ProductRiaLib
- Readme.txt
|
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;
private StateCacheList<StateCache> _mainStateList;
public MainPageViewModel()
{
// For saving module state info
Messenger.Default.Register(this, MessageToken.PutStateMessage,
new Action<StateCacheList<StateCache>>(OnPutStateMessage));
_mainStateList = new StateCacheList<StateCache>();
// For receiving state info
Messenger.Default.Register<NotificationMessageAction<StateCacheList<StateCache>>>
(this, MessageToken.GetStateMessage, message => OnGetStateMessage(message));
}
// Get cached state data and set loading property accordingly
private void OnPutStateMessage(StateCacheList<StateCache> stateList)
{
if (stateList != null)
{
// Remove all previous items for the calling module
if (_mainStateList != null)
{
_mainStateList.RemoveAll(m => m.ModuleID == stateList[0].ModuleID);
}
// Add the state list to main list
_mainStateList.AddRange(stateList);
stateList = null;
}
}
private void OnGetStateMessage(NotificationMessageAction<StateCacheList<StateCache>> message)
{
if (message != null)
{
// Retrieve the list for the requester
StateCacheList<StateCache> stateList = new StateCacheList<StateCache>();
stateList.AddRange(_mainStateList.Where(w => w.ModuleID == message.Notification));
if (stateList.Count > 0)
{
// Send the state list back
message.Execute(stateList);
stateList = null;
}
}
}
// 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;
// Send message back to ManiPageView code-behind to load AnotherScreenView
case ModuleID.AnotherScreenView:
Messenger.Default.Send(ModuleID.AnotherScreenView, MessageToken.LoadScreenMessage);
_currentViewText = ModuleID.AnotherScreenView;
break;
// Load AnotherXap on-demand
case ModuleID.AnotherXapView:
xapUri = "/ClientBin/AnotherXap.Views.xap";
_catalogService.AddXap(xapUri, arg => AnotherXap_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;
}
private void AnotherXap_OnXapDownloadCompleted(AsyncCompletedEventArgs e)
{
// Send message back to View code-behind to load AnotherXap View
Messenger.Default.Send(ModuleID.AnotherXapView, MessageToken.LoadScreenMessage);
_currentViewText = ModuleID.AnotherXapView;
}
}
}
|
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.
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.