如何以MVVM友好的方式向DataGrid添加新行

Moo*_*ght 7 c# wpf datagrid mvvm

我有以下内容 DataGrid

<DataGrid CanUserDeleteRows="True" 
          CanUserAddRows="True"
          SelectedItem="{Binding SelectedResource, Mode=TwoWay}"
          ItemsSource="{Binding Path=Resources, Mode=TwoWay,
                                UpdateSourceTrigger=PropertyChanged, 
                                IsAsync=True}"> ... </<DataGrid>
Run Code Online (Sandbox Code Playgroud)

我使用MVVM模式绑定到一个ObservableCollection<ResourceViewModel> Resources,这很好用.我有一个添加新行的按钮,这是通过添加一个新ResourceViewModelResources集合来完成的- 很棒.现在,我希望用户能够点击空的最后一行,这会自动在中创建一个新记录DataGrid.

我已经确定的DataGridCanUserAddRows=True.我确保我绑定的collection Resources(ResourceViewModel)中的类有一个默认构造函数(没有参数),并且我确保集合类型不是readonly.当用户点击最后一行时,默认构造函数会触发,但要正确实例化ResourceViewModel需要的新对象,请引用该Resources集合的网格...

我想我可以AttachedCommandCellBeginEdit事件中使用和然后在ResourceViewModel那里添加一个新的可观察集合,有没有一种标准的方法来做到这一点?


请注意,我已阅读以下问题,这些对我没有帮助

  1. WPF DataGrid - 新行的事件?
  2. 如何使用DataGrid和MVVM添加行

编辑.事实证明,由于WPF中的错误,我在执行此操作时遇到了问题DataGrid.见Nigel Spencer的博客.但是,他的修复目前对我不起作用......

She*_*dan 3

据我了解,您知道如何正确地将新项目添加到数据绑定集合中,以将新项目添加到中,并且DataGrid您的问题实际上涉及当用户单击最后一行时如何执行此操作DataGrid。在视图模型中处理某些事件的一般方法是创建一个Attached Property(如果尚不存在)来为您处理该事件。

例如,您可以创建一个将处理程序附加到相关事件的处理程序,以及另一个在调用事件处理程序时可以执行的Attached Property类型。ICommand然后,您可以在视图模型中编写该功能ICommand(在其中将新项目添加到数据绑定集合中),并将您的ICommand实现数据绑定到Attached ICommand Property.

因为我相当确定您知道如何定义Attached Propertys,所以我不会通过向您展示来侮辱您。如果我误解了您的意思,或者没有表达清楚,请告诉我。