WPF MVVM Light DataGrid和单独的Add Item View

时间:2013-02-11 23:09:21

标签: wpf entity-framework mvvm datagrid mvvm-light

我正在学习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。它是否通过相同的实例?

1 个答案:

答案 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事件触发时,而不是仅添加新项目,再次获取整个数据集。