我正在尝试在 WPF 中使用 MVVM Light Toolkit 学习 MVVM。但我被困在一个简单的问题上。
我有一个 AddEditProfileWindow,它基本上有一个配置文件名称的文本框和一个确认按钮。它将新配置文件添加到数据库表或更新现有配置文件的名称。
在 MainWindow/MainViewModel 我有一个配置文件列表和两个按钮:“添加配置文件”和“编辑所选配置文件”。他们都通过命令+消息打开这个窗口。例如这里是“添加配置文件”按钮的命令
public RelayCommand OpenAddProfileWindowCommand
{
get
{
return _openAddProfileWindowCommand ?? (_openAddProfileWindowCommand = new RelayCommand(
() => { Messenger.Default.Send(new NotificationMessage("OpenAddProfile")); }));
}
}
它是 MainWindow 代码后面的接收器
private void MessageReceived(NotificationMessage msg)
{
if (msg.Notification == "OpenAddProfile")
{
var window = new AddEditProfileWindow();
window.Owner = this;
window.ShowDialog();
}
}
所以问题是我需要以某种方式将参数传递给 AddEdit... Window/ViewModel(例如在 ViewModel 中设置 IsEditing bool 属性)来更改窗口行为并对其进行一些自定义(将标题和确认按钮文本更改为“添加”或“更新”)。另外为了更新我需要所选记录的 Profile 对象(或至少 Id)。
为了创建 ViewModel,我使用 ViewModelLocator 和 Unity
public ViewModelLocator()
{
var container = new UnityContainer();
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));
container.RegisterType<MainViewModel>(new ContainerControlledLifetimeManager()); // singleton
container.RegisterType<AddEditProfileViewModel>();
}
public AddEditProfileViewModel AddEditProfile
{
get
{ return ServiceLocator.Current.GetInstance<AddEditProfileViewModel>(); }
}
我已经阅读了很多类似的线程和示例,但仍然不明白我应该如何将参数传递给视图模型。一些答案建议在应用程序启动时在 ViewModelLocator 中创建视图模型(并使它们成为单例),然后我可以在打开之前发送消息。但看起来不是很干净,而且我需要在打开之前重置视图模型(可能通过 Cleanup() )。
有没有更好/更容易/更清洁的方法?