The Multinotes solution contains examples for each of the supported Microsoft client frameworks.
- Windows Store
- Windows Phone
- WPF
- ASP.NET
- Silverlight
Fork the repository, pull the code, and build the solution. Join a message board from any two clients, and they will collaborate with one another.
Each of the clients defines its own SynchronizationService. It initializes a Community with storage and communication strategies, and registers the model.
public void Initialize() { var storage = new FileStreamStorageStrategy(); var http = new HTTPConfigurationProvider(); var communication = new BinaryHTTPAsynchronousCommunicationStrategy(http); _community = new Community(storage); _community.AddAsynchronousCommunicationStrategy(communication); _community.Register<CorrespondenceModel>(); }
Then it subscribes to the parts of the model that the user is interested in.
_community.Subscribe(() => Individual); _community.Subscribe(() => Individual.MessageBoards);
The ViewModelLocator calls the initializer, and then creates each of the view models that the views data bind to.
public class ViewModelLocator : ViewModelLocatorBase { private readonly SynchronizationService _synchronizationService; public ViewModelLocator() { _synchronizationService = new SynchronizationService(); if (!DesignMode) _synchronizationService.Initialize(); else _synchronizationService.InitializeDesignMode(); } public object Main { get { return ViewModel(() => new MainViewModel( _synchronizationService.Individual)); } } }
The view model projects the model so that it could be data bound.
public class MainViewModel { private readonly Individual _individual; public MainViewModel( Individual individual) { _individual = individual; } public IEnumerable<MessageBoardViewModel> MessageBoards { get { return from share in _individual.Shares orderby share.MessageBoard.Topic select new MessageBoardViewModel(share); } } }
Child view models continue the projection.
public class MessageBoardViewModel { private readonly Share _share; public MessageBoardViewModel(Share share) { _share = share; } public string Topic { get { return _share.MessageBoard.Topic; } } public IEnumerable<messageviewmodel> Messages { get { return from message in _share.MessageBoard.Messages select new MessageViewModel(message); } } }
Each of these examples is based on a shared model, so that they can collaborate with one another. They register the model with a Community, define a ViewModelLocator to construct the top-level view models, and then define bindable properties for use in the views.