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