0

我正在学习 WPF 和 MVVM,并且我正在尝试制作一个程序,该程序具有 DataGrid 和一个按钮,该按钮通过使用可以将项目添加到 DataGrid 的命令来打开另一个表单。

问题是我不确定我应该如何使用视图模型来实现它。我有 1 个视图模型,用于我的 DataGrid 表单,它可以正常工作,并且正在使用存储库从实体框架中检索数据。

是否可以从添加表单中添加一个对象,并在我按下添加按钮时自动以另一种形式出现在 DataGrid 中,或者我是否需要在 DataGrid 上执行一些刷新操作?我在我的视图模型中使用了可观察的集合,并且我在视图模型的集合参数中实现了 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>();

ParentListViewModel 是我的 DataGrid ViewModel,而 EditParentViewModel 是用于在存储库中添加/编辑记录的。服务定位器自动传递存储库的实例,所以我不知道它如何将存储库的实例传递给 ViewModel。它是否通过相同的实例?

4

1 回答 1

1

当您向存储库添加内容时,视图模型不会自动刷新。

可观察集合所做的所有事情都是在向可观察集合添加/删除新项目时通知 UI(粗略地说)。INotifyPropertyChange 所做的只是通知 UI 特定属性已更改。

你有几个选择来获得你想要的工作(如果我理解正确的话):

  • 添加项目时,您可以刷新整个可观察集合
  • 当添加新项目时,您可以让存储库通过事件通知您的数据网格视图模型 - 然后您的数据网格视图模型可以更新其可观察集合
  • 您可以让 Add Form 视图模型与 Data Grid 视图模型对话,并在添加新项目时告诉它 - 在这种情况下,您需要一些机制来将信息从一个视图模型编组到另一个视图模型。

这有帮助吗?

格林威治标准时间 2013 年 12 月 2 日 17:30 编辑:

这是选项 2 的一个非常快速和肮脏的示例。它要求在 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 事件触发时,而不是仅仅添加新项目,您可以再次获取整个数据集。

于 2013-02-12T10:05:44.867 回答