我正在学习MVVM,而且我很难理解他的一些概念。我的问题是如何显示一个子窗口,他的视图模型接受构造函数,一个用于添加新对象,用新对象初始化对象,另一个用于修改用第二个构造函数传递的对象。我不知道使用Unity的方式是否正确。所以基本上我有两个问题:
这是我在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对象?
我认为对于统一容器的使用存在误解,我怀疑你期望统一容器就像工厂模式一样。实际上它更像是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();
}