|
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ViewModelManager.cs" company="Catel development team">
// Copyright (c) 2008 - 2011 Catel development team. All rights reserved.
// </copyright>
// <summary>
// Manager for view models. Thanks to this manager, it is possible to subscribe to other view models and be able to respond
// correctly to property changes in other views.
// </summary>
// --------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using Catel.Properties;
using log4net;
namespace Catel.MVVM
{
/// <summary>
/// Manager for view models. Thanks to this manager, it is possible to subscribe to other view models and be able to respond
/// correctly to property changes in other views.
/// </summary>
public class ViewModelManager
{
#region Variables
/// <summary>
/// The <see cref="ILog">log</see> object.
/// </summary>
private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Dictionary containing all the managed view models by this view model manager.
/// </summary>
private readonly Dictionary<Type, ManagedViewModel> _managedViewModels = new Dictionary<Type, ManagedViewModel>();
#endregion
#region Constructor & destructor
/// <summary>
/// Initializes a new instance of the <see cref="ViewModelManager"/> class.
/// </summary>
/// <remarks>
/// The constructor is private because this is a singleton class.
/// </remarks>
internal ViewModelManager()
{
Log.Debug(TraceMessages.InstantiatedViewModelManager);
}
#endregion
#region Properties
#endregion
#region Methods
/// <summary>
/// Registers a view model instance with the manager. All view models must register themselves to the manager.
/// </summary>
/// <param name="viewModel">The view model to register.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
internal void RegisterViewModelInstance(IViewModel viewModel)
{
RegisterViewModelInstanceInternal(viewModel);
}
/// <summary>
/// Registers a view model instance with the manager. All view models must register themselves to the manager.
/// </summary>
/// <param name="viewModel">The view model to register.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
private void RegisterViewModelInstanceInternal(IViewModel viewModel)
{
if (viewModel == null)
{
throw new ArgumentNullException("viewModel");
}
var managedViewModel = GetManagedViewModel(viewModel.GetType());
managedViewModel.AddViewModelInstance(viewModel);
}
/// <summary>
/// Unregisters a view model instance from the manager. All view models must unregister themselves from the manager.
/// </summary>
/// <param name="viewModel">The view model to unregister.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
internal void UnregisterViewModelInstance(IViewModel viewModel)
{
UnregisterViewModelInstanceInternal(viewModel);
}
/// <summary>
/// Unregisters a view model instance from the manager. All view models must unregister themselves from the manager.
/// </summary>
/// <param name="viewModel">The view model to unregister.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
private void UnregisterViewModelInstanceInternal(IViewModel viewModel)
{
if (viewModel == null)
{
throw new ArgumentNullException("viewModel");
}
var managedViewModel = GetManagedViewModel(viewModel.GetType());
managedViewModel.RemoveViewModelInstance(viewModel);
}
/// <summary>
/// Adds an interested view model instance. The <see cref="IViewModel"/> class will automatically register
/// itself to the manager by using this method when decorated with the <see cref="InterestedInAttribute"/>.
/// </summary>
/// <param name="viewModelType">Type of the view model the <paramref name="viewModel"/> is interested in.</param>
/// <param name="viewModel">The view model instance.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModelType"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
internal void AddInterestedViewModel(Type viewModelType, IViewModel viewModel)
{
AddInterestedViewModelInstanceInternal(viewModelType, viewModel);
}
/// <summary>
/// Adds an interested view model instance. The <see cref="IViewModel"/> class will automatically register
/// itself to the manager by using this method when decorated with the <see cref="InterestedInAttribute"/>.
/// </summary>
/// <param name="viewModelType">Type of the view model the <paramref name="viewModel"/> is interested in.</param>
/// <param name="viewModel">The view model instance.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModelType"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
private void AddInterestedViewModelInstanceInternal(Type viewModelType, IViewModel viewModel)
{
if (viewModel == null)
{
throw new ArgumentNullException("viewModel");
}
var managedViewModel = GetManagedViewModel(viewModelType);
managedViewModel.AddInterestedViewModel(viewModel);
}
/// <summary>
/// Removes an interested view model instance. The <see cref="IViewModel"/> class will automatically unregister
/// itself from the manager by using this method when decorated with the <see cref="InterestedInAttribute"/>.
/// </summary>
/// <param name="viewModelType">Type of the view model the <paramref name="viewModel"/> was interested in.</param>
/// <param name="viewModel">The view model instance.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModelType"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
internal void RemoveInterestedViewModelInstance(Type viewModelType, IViewModel viewModel)
{
RemoveInterestedViewModelInstanceInternal(viewModelType, viewModel);
}
/// <summary>
/// Removes an interested view model instance. The <see cref="IViewModel"/> class will automatically unregister
/// itself from the manager by using this method when decorated with the <see cref="InterestedInAttribute"/>.
/// </summary>
/// <param name="viewModelType">Type of the view model the <paramref name="viewModel"/> was interested in.</param>
/// <param name="viewModel">The view model instance.</param>
/// <exception cref="ArgumentNullException">When <paramref name="viewModelType"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException">When <paramref name="viewModel"/> is <c>null</c>.</exception>
private void RemoveInterestedViewModelInstanceInternal(Type viewModelType, IViewModel viewModel)
{
if (viewModelType == null)
{
throw new ArgumentNullException("viewModelType");
}
if (viewModel == null)
{
throw new ArgumentNullException("viewModel");
}
var managedViewModel = GetManagedViewModel(viewModelType);
managedViewModel.RemoveInterestedViewModel(viewModel);
}
/// <summary>
/// Gets the managed view model for a specific view model type.
/// </summary>
/// <param name="viewModelType">Type of the view model.</param>
/// <returns>The <see cref="ManagedViewModel"/> of the specified type.</returns>
private ManagedViewModel GetManagedViewModel(Type viewModelType)
{
lock (_managedViewModels)
{
if (!_managedViewModels.ContainsKey(viewModelType))
{
_managedViewModels.Add(viewModelType, new ManagedViewModel(viewModelType));
}
return _managedViewModels[viewModelType];
}
}
#endregion
}
}
|
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.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.