1

我最近一直在研究 MVVM,在我发现Caliburn.Micro之后,事情变得非常顺利;我仍处于早期学习阶段,但我相信我对 MVVM 基础知识感觉还不错。

不过,我遇到了WPF的问题——这与我在 WinForms 中遇到DataGrid的问题几乎相同DataGridView:你到底是如何CanUserAddRows=true干净地处理网格内项目添加的?

我显然不想DataGrid在我的 ViewModel 中添加特定的 hack,因为理想情况下它应该可以重新用于其他View控件。同时,我希望能够在添加新项时收到通知,以便我可以立即将其持久化。

我将 - 绑定DataGridBindableCollection<FooModel> FooItems一个干净的 MVVM 设计,如果我理解正确,我将能够处理FooItems.CollectionChanged并响应添加/删除事件。但是,DataGrid一旦添加了默认构造的项目,就会触发 Add 事件 - 这显然不是持久化对象的正确时间!

在通过 StackOverflow 进行大量谷歌搜索和挖掘之后,我得到的印象DataGrid是它如何触发 Add/Remove 事件完全迟钝。使用它的人CanUserAddRows=true似乎只在内存集合上工作,其中持久化数据的人似乎使用单独的输入字段 +按钮命令来添加新项目。

我的FooModel实现INotifyPropertyChanged但不是IEditableObject- 据我所知,这不应该是问题,因为 IEO 似乎与属性编辑/撤消有关,而我的问题是何时触发 Add 事件......

那么,您如何干净地处理网格内编辑?

4

2 回答 2

2

听起来 WPF 的DataGrid行为方式与 WinForms 非常相似DataGridView,因为一旦用户开始进入“新行”,它就会在数据源中创建一个项目。随后的编辑将导致集合中新项目的属性发生变化。

如果您要BindingList<FooModel>改用,您会得到一个名为的附加事件ListChanged- 提供您的FooModel类型 implements INotifyPropertyChanged,该事件将在项目的属性更改时触发(以及从集合中添加/删除项目时)。

希望这可以帮助!

于 2010-11-05T14:03:46.680 回答
0

我知道自从被问到这个问题已经很长时间了,但我现在正在做类似的事情,并认为我会发布我的解决方案。您可能认为这是一种 hack,但这是我能想到的让 DataGrid 告诉我何时退出编辑模式的最佳方法(出于我自己的原因)。

我查看了 DataGrid 代码,发现最接近我可以覆盖的结束编辑,结果是 OnExecutedCommitEdit()。然后我只是在该函数完成后引发一个事件。当我的事件订阅者被调用时,DataGrid 不再处于编辑模式,我可以做任何我需要的事情。这是代码:

/// <summary>
/// Deriving a new DataGrid because we need an event to tell us when editing is complete.
/// </summary>
public class DataGridMod : DataGrid
{
   public delegate void EditCompletedDelegate();
   public EditCompletedDelegate EditCompleted;

   public DataGridMod() { }

   protected override void OnExecutedCommitEdit(ExecutedRoutedEventArgs e)
   {
      base.OnExecutedCommitEdit(e);

      if (EditCompleted != null)
         EditCompleted();
   }
}
于 2013-04-08T23:45:22.670 回答