1

This is my UnityResolver Class to create the instance of IUnityContainer

public sealed class UnityResolver 
{
    private static IUnityContainer _unityContainer;
    private static volatile UnityResolver _unityresolverinstance;
    private static object syncRoot = new Object();
    public  static IUnityContainer UnityContainerInitiation
    {
        get
        {
            if (_unityContainer == null)
            {
                if (_unityresolverinstance == null)
                {
                    lock (syncRoot)
                    {
                        if (_unityresolverinstance == null)
                            _unityresolverinstance = new UnityResolver();
                    }
                }
            }
            return UnityResolver._unityContainer;
        }
    }

    public UnityResolver()
    {
        _unityContainer = new UnityContainer();
        _unityContainer.RegisterType<MaintainRouteViewModel>();

    }

}

Below is my Base View and Its ViewModelCode

   public partial class MaintainRouteView : UserControl
    {
    public MaintainRouteViewModel maintainRouteViewModel = null;
    IUnityContainer container;

    public MaintainRouteView()
    {
        InitializeComponent();
        container = UnityResolver.UnityContainerInitiation;
        maintainRouteViewModel = container.Resolve<MaintainRouteViewModel>();
        this.DataContext = maintainRouteViewModel;
    }

  ///This button will navigate to the child view.
    private void AddRoute_Click(object sender, RoutedEventArgs e)
    {
        pageAnimationControl.ShowPage(new AddNewRouteView());
    }
} 

Its ViewModel..

public class MaintainRouteViewModel : viewModelbase
{
    private string _statusSuccessMessage = null;
    private string _statusFailMessage =null;

    private ObservableCollection<RouteDetailsModel> _routeDetailsCollection;

    public ObservableCollection<RouteDetailsModel> routeDetailsCollection
    {
        get
        {
        return this._routeDetailsCollection;
        }
        set
        {
        this._routeDetailsCollection =  value;
        RaisePropertyChanged("routeDetailsCollection");
        }
    }
    public string StatusSuccessMessage
    {
        get
        {
            return _statusSuccessMessage;
        }
        set
        {
            _statusSuccessMessage = value;
            this.RaisePropertyChanged("StatusSuccessMessage");
        }
    }
    public string StatusFailMessage
    {
        get { return _statusFailMessage; }
        set
        {
            _statusFailMessage = value;
            this.RaisePropertyChanged("StatusFailMessage");
        }
    }
    public MaintainRouteViewModel()
    {

        ///it will load some data to the Observablecollection 
        getAllCurrentRouteData();
    }
 }

Now Below is my Child View and its ViewModel....

  public partial class AddNewRouteView : UserControl
{     
    public AddNewRouteView()
    {
        InitializeComponent();
        IUnityContainer container = UnityResolver.UnityContainerInitiation;
        this.DataContext = container.Resolve<AddNewRouteViewModel>();
    }

}

Its ViewModel....

 public class AddNewRouteViewModel : viewModelbase
  {
    private MaintainRouteViewModel maintainRouteViewModel;

    public ICommand SaveCommand
    {
        get;
        set;
   }

    [InjectionConstructor]
    public AddNewRouteViewModel(MaintainRouteViewModel maintainRouteViewModel)
    {
       this.maintainRouteViewModel  = maintainRouteViewModel;
       SaveCommand = new DelegateCommand<object>((a) => ValidateNewRoute());
     }

    private void ValidateNewRoute()
    {
      bool flag  = saveAndValidate();
        if(flag)
         {
       updateRouteStatus();
         }
    }

    public void updateRouteStatus()
          {
            maintainRouteViewModel.StatusSuccessMessage = "New Route successfully Added..";

          }
    }
}

Can Anyone Tell me how to use this way to get the same object of MaintainRouteViewModel in my Child VM Constructor So that i will show the Updated Status Message in my Base view MaintainRouteView???

*It will Work Fine If i replace my MaintainRouteView with below code :

this Is an another approach to use IOC .i previously using this in my project. it Works Fine for me but now i want to implement the same thing using Unity Container. Please Help.

public partial class MaintainRouteView : UserControl
{
    public MaintainRouteViewModel maintainRouteViewModel = null;

    public MaintainRouteView()
    {
        InitializeComponent();
        maintainRouteViewModel = new MaintainRouteViewModel();
        this.DataContext = maintainRouteViewModel;
    }

    private void AddRoute_Click(object sender, RoutedEventArgs e)
    {
        pageTransitionControl.ShowPage(
        new AddNewRouteView
        {
            DataContext = new AddNewRouteViewModel(maintainRouteViewModel)
        });
    }
}
V J
  • 77
  • 12
  • You have to read more about MVVM. Whatever you are approaching, isn't MVVM as it violates it in multiple places. Views should in general be unaware of other Views. If you want share data, use messaging or services. You shouldn't register events in the View, especially not stuff like Clicks etc. That's what commands are for. I'd suggest using Prism as MVVM Framework, as it offers all the tools to do proper MVVM, like auto resolving of the ViewModel with it's own ViewModel locator and rathe than creating your own class, you inherit from Bootstraper for the registrations – Tseng Sep 26 '15 at 15:56
  • yes you are absolutely right Tseng. this is not the correct MVVM approach but my concern is that why i am not able to utilize the same viewmodel object data in the target viewmodel using the unity dependency injection. instead of it if i use the simple IOC approach it works. how to properly inject the same using Unity? – V J Sep 26 '15 at 16:25

1 Answers1

0

I am able to solve this issue using the LifeTime Management of Unity Container Register Types. it will work fine if i tell the container to create a singleton instance of the MaintainRouteViewModel Class. using :

   container.RegisterType<MaintainRouteViewModel>(
    new ContainerControlledLifetimeManager());

But it's just a workaround to get the expected result. i want to achieve it using a proper dependency injection without any singleton instance principle. Can anyone please help to provide the solution.

V J
  • 77
  • 12