如何使用带有两个构造函数的viewmodel的Unity框架显示子窗口?

问题描述 投票:1回答:1

我正在学习MVVM,而且我很难理解他的一些概念。我的问题是如何显示一个子窗口,他的视图模型接受构造函数,一个用于添加新对象,用新对象初始化对象,另一个用于修改用第二个构造函数传递的对象。我不知道使用Unity的方式是否正确。所以基本上我有两个问题:

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

这是我在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中打开子窗口的代码:

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

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

在我的子窗口中的这个构造函数:

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

编辑:她我只使用一个构造函数,但在这两种情况下如何传递我的情况下的Member对象?

c# wpf mvvm dependency-injection unity-container
1个回答
0
投票

我认为对于统一容器的使用存在误解,我怀疑你期望统一容器就像工厂模式一样。实际上它更像是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();
}

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

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.