如何使用Unity与构造函数注入来更新viewmodel1的父视图中的状态使用子视图&和它在wpf中的viewmodel2

时间:2015-09-26 15:11:44

标签: c# mvvm dependency-injection unity-container ioc-container

这是我创建IUnityContainer实例的UnityResolver类

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>();

    }

}

以下是我的基本视图及其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());
    }
} 

其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();
    }
 }

现在,下面是我的子视图及其ViewModel ....

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

}

它的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..";

          }
    }
}

任何人都可以告诉我如何使用这种方式在我的子VM构造函数中获取MaintainRouteViewModel的相同对象这样我将在我的基本视图中显示更新状态消息MaintainRouteView ???

*它会正常工作如果我用以下代码替换 MaintainRouteView

这是使用IOC .i的另一种方法,以前在我的项目中使用它。它适用于我,但现在我想使用 Unity容器实现相同的功能。请帮助。

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)
        });
    }
}

1 个答案:

答案 0 :(得分:0)

我可以使用Unity容器寄存器类型的LifeTime管理来解决此问题。 如果我告诉容器创建MaintainRouteViewModel类的单例实例,它将正常工作。 使用:

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

但这只是获得预期结果的解决方法。我希望使用适当的依赖注入来实现它,而不需要任何单例实例原则。任何人都可以帮助提供解决方案。