如何使用具有两个构造函数的视图模型的 Unity 框架显示 child window?

How to show child window using Unity framework with a viewmodel of two constructors?

我正在学习 MVVM,但在理解他的一些概念时遇到了很多困难。我的问题是如何向构造函数显示他的视图模型接受的 child window 一个用于添加新 object 的 object 用新 object 初始化 object 和一个另一个用于修改与第二个构造函数一起传递的 object 。而且我不知道我使用 Unity 的方式是否正确。 所以基本上我有两个问题:

  1. 我使用unity的方式对吗?
  2. 如何打开child window 他的视图模型有两个构造函数,一个用于编辑模式,另一个用于添加模式?

这是我在 app.xaml.cs 中的代码:

public partial class App : Application
{
    public static readonly UnityContainer container = new UnityContainer();

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        container.RegisterType<IMemberRepository, MemberRepository>();

        container.RegisterType<ShellViewModel>();

        var window = new Shell
        {
            DataContext = container.Resolve<ShellViewModel>()
        };

        window.ShowDialog();
    }

}

这是我在 SellViewModel 中打开的代码 child window:

public ShellViewModel()
{
    NewMember = new DelegateCommand(ShowMethod);
}

private void ShowMethod()
{
    var child = new AddMemberView
    {
        DataContext = App.container.Resolve<AddMemberViewModel>()
    };
    child.ShowDialog();
}

我的 child window 中的这个构造函数:

public AddMemberViewModel(IMemberRepository repo, Member member = null)
{
    _repo = repo;
    SaveCommand = new DelegateCommand(SaveMember, CanSave);
    if (member == null)
        _Member = new Member();
    else
        _Member = member;
}

Edit: her I using only one constructors but in both cases how to passed the Member object in my case?

我认为unity容器的用法存在误解,我怀疑你希望unity容器像工厂模式一样工作。实际上它更像 Singleton 模式(不完全相同但比 Facotry 更接近)。 我建议在您的上下文中稍微改变一下实例化视图(和视图模型)的方式

private void ShowMethod()
{
    AddMemberViewModel vm = App.container.Resolve<AddMemberViewModel>();
    vm.Member = new Member(); // Replace here with your Member object you want 
                              // to edit
    var child = new AddMemberView
    {
        DataContext = vm
    };
    child.ShowDialog();
}

你也可以忘记在容器中注册这个特定的视图模型(因为它似乎不应该在你的应用程序中有一个唯一的实例)并在这个

中使用它
private void ShowMethod()
{
    IMemberRepository repo = App.container.Resolve<IMemberRepository>();

    // Replace 'new Member()' here with your Member object you want to edit
    AddMemberViewModel vm = new AddMemberViewModel(repo, new Member())

    var child = new AddMemberView
    {
        DataContext = vm
    };
    child.ShowDialog();
}