我正在学习WPF和MVVM,我正在尝试创建一个具有DataGrid和一个按钮的程序,该按钮使用一个命令打开另一个表单,您可以在其中向DataGrid添加项目。
问题是我不确定如何使用viewmodels实现它。我有一个viewmodel,它适用于我的DataGrid表单,它可以正常工作,并使用存储库从Entity Framework中检索数据。
是否可以从“添加表单”添加对象,并在按下“添加”按钮时自动将其显示在另一个表单的DataGrid中,或者是否需要对DataGrid执行一些刷新操作?我在viewmodel中使用了可观察的集合,并且我在视图模型的collection参数中实现了OnPropertyChange功能。
据我所知,当我在存储库中放入某些东西时,应该刷新从中获取数据的每个视图模型......虽然我不确定是否应该编写一些消息代码来实现它。
我对此非常困惑,我希望有人能在这里阐明一些...... 提前致谢。告诉我,如果我错过了提及的东西,我会添加它:)
编辑: 这就是我注册模型的方式:
SimpleIoc.Default.Register<ParentsListViewModel>();
SimpleIoc.Default.Register<EditParentViewModel>();
这就是我注册我的存储库的方式:
SimpleIoc.Default.Register<IParentsRepository, ParentsRepository>();
这就是我检索ViewModel实例的方法:
ParentsListViewModel parentsListViewModelInstance = ServiceLocator.Current.GetInstance<ParentsListViewModel>();
EditParentViewModel editParentViewModelInstance = ServiceLocator.Current.GetInstance<EditParentViewModel>();
ParentsListViewModel是我的DataGrid ViewModel,EditParentViewModel用于添加/编辑存储库中的记录。 服务定位器自动传递存储库的实例,因此我不知道它如何将存储库的实例传递给ViewModels。它是否通过相同的实例?
答案 0 :(得分:1)
当您向存储库添加内容时,视图模型不会自动刷新。
所有可观察集合都会在向可观察集合添加/删除新项目时通知UI(粗略地说)。所有INotifyPropertyChange都会通知UI特定属性已更改。
您可以选择一些方法来获得您想要的工作(如果我理解正确的话):
这有帮助吗?
编辑12/02/2013 17:30 GMT:
这是一个非常快速和肮脏的例子,说明选项2的外观。它要求在两个视图模型之间共享存储库的相同实例 - 在这种情况下,我将它注入构造函数。
public interface IParentsRepository{
event EventHandler<MyItemAddedEventArgs> ItemAdded;
//your normal interface implementation here
}
public class ParentsRepository : IParentsRepository
{
public event EventHandler<MyItemAddedEventArgs> ItemAdded;
public List<MyItem> GetAllItems()
{
//logic that returns all your items here
return new List<MyItem>();
}
public void AddItem(MyItem item)
{
//logic that adds you item here
//fire the item added event
OnItemAdded(item);
}
private void OnItemAdded(MyItem item)
{
if(ItemAdded != null)
ItemAdded(this, new MyItemAddedEventArgs(item));
}
}
public class MyItemAddedEventArgs : EventArgs
{
public MyItemAddedEventArgs(MyItem itemAdded)
{
}
public MyItem ItemAdded { get; set; }
}
public class MyItem
{
public string SomeProperty { get; set; }
}
public class MyDataGridViewModel
{
private readonly IParentsRepository _parentsRepository;
public MyDataGridViewModel(IParentsRepository parentsRepository)
{
_parentsRepository = parentsRepository;
_parentsRepository.ItemAdded += _parentsRepository_ItemAdded;
var myItems = _parentsRepository.GetAllItems();
MyItems = new ObservableCollection<MyItem>(myItems);
}
void _parentsRepository_ItemAdded(object sender, MyItemAddedEventArgs e)
{
if(!MyItems.Contains(e.ItemAdded))
MyItems.Add(e.ItemAdded);
}
public ObservableCollection<MyItem> MyItems { get; set; }
}
public class MyAddItemViewModel
{
private readonly IParentsRepository _parentsRepository;
public MyAddItemViewModel(IParentsRepository parentsRepository)
{
_parentsRepository = parentsRepository;
}
//your logic to add an item here
}
可以轻松地将此方法调整为方法1,以便在_parentsRepository_ItemAdded事件触发时,而不是仅添加新项目,再次获取整个数据集。