c# - 如何使用带有构造函数注入(inject)的 Unity 在 wpf 中使用 subview & 及其 viewmodel2 更新 viewmodel1 的父 View 中的状态

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

    }

}

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

它的 View 模型..
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();
    }
 }

现在下面是我的 subview 及其 ViewModel....
  public partial class AddNewRouteView : UserControl
{     
    public AddNewRouteView()
    {
        InitializeComponent();
        IUnityContainer container = UnityResolver.UnityContainerInitiation;
        this.DataContext = container.Resolve<AddNewRouteViewModel>();
    }

}

它的 View 模型......
 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 对象,以便我将在我的基本 View MaintainRouteView 中显示更新的状态消息???

*它会正常工作如果我更换我的 维护RouteView 使用以下代码:

这是使用 IOC 的另一种方法。我以前在我的项目中使用过它。它对我来说很好,但现在我想使用 Unity Container 实现同样的事情。请帮忙。
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)
        });
    }
}

最佳答案

我可以使用 Unity Container Register Types 的 LifeTime Management 来解决这个问题。
如果我告诉容器创建一个 MaintainRouteViewModel 类的单例实例,它会正常工作。
使用 :

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

但这只是获得预期结果的一种解决方法。我想在没有任何单例实例原则的情况下使用适当的依赖注入(inject)来实现它。任何人都可以请帮助提供解决方案。

关于c# - 如何使用带有构造函数注入(inject)的 Unity 在 wpf 中使用 subview & 及其 viewmodel2 更新 viewmodel1 的父 View 中的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798637/

相关文章:

c# - 为什么将 null 转换为类型以进行方法选择?

c# - 在 WPF 中对分类数据进行分组

c# - .Net MAUI : How to select single and multiple items using MVVM and CollectionView

c# - 带有依赖注入(inject)的工厂模式,serviceProvider 总是返回 null

c# - GC如何清理结构?

c# - TreeListEx,使用模板 _StandardValues 设置的字段未从 sitecore 检索?

java - 向 Spring bean 注入(inject)依赖

c# - ASP.Net Core 3.0 依赖注入(inject)忽略工厂方法?

c# - Monogame音频不起作用

c# - 如何在WPF中选择两个切换按钮之一?