我正在使用Telerik的Silverlight RADGridView控件并尝试以纯MVVM方式实现它。我正在使用MVVMLight的EventToCommand将控件的事件传递给我的viewmodel。
特别是,我正在尝试处理AddingNewDataItem事件。
虽然MVVMLight的PassEventArgsToCommand工作正常,但我对参数所做的任何更改都不会传递回网格控件(特别是NewObject参数)。如果我在后面的代码中操作NewObject,一切正常。
有没有人有这方面的工作经验?截至目前,看起来Telerik只是'有点'支持MVVM,这是不幸的。
答案 0 :(得分:2)
在后面的代码隐藏中使用代码意味着代码偏离了MVVM模式。只要代码的目的是操纵UI而不引用任何问题域数据,在代码隐藏中使用代码是完全合法的。实际上,将UI操作放在ViewModel中是错误的。
目前尚不清楚你想要完成什么,但如果你将GridViewRowEditEndedEventArgs的引用传递给你的ViewModel,那就是偏离了MVVM模式,因为ViewModel现在依赖于View实现。
在MVVM模式中,View'知道'ViewModel和ViewModel'知道'模型。但模型不依赖于或了解ViewModel,而ViewModel不依赖于或了解View。
如果要将GridViewRowEditEndedEventArgs引用传递给ViewModel,问题是如果/当您将视图更改为其他控件(如RadListBox,Infragistics网格控件或任何其他)时,ViewModel将停止正常运行。
您的陈述:
Telerik只有'有点'支持MVVM
不公平且不正确。
MVVM的目标不是从代码隐藏中消除代码。这是一种常见的误解。 MVVM的目标是提升可测试性并删除域名和域名。从背后的代码中模拟逻辑,作为良好的“关注点分离”实践的一部分。
当代码隐藏代码被简单地移动到名为SomethingSomethingViewModel的类时......不是MVVM。
答案 1 :(得分:0)
Eric,我正在使用Silverlight GridView控件和MVVMLight,并且能够让它成功运行。
我认为您的问题可能更多是对AddingNewDataItem事件的理解。如果您查看Adding New Entries的文档,您会看到
之前引发了AddingNewDataItem 显示新行。在这种情况下 处理程序初始化对象 必须添加并传递给 GridViewAddingNewEventArgs。
获得初始化对象后,您还需要处理RowEditEnded事件以提交或取消您所做的更改。同样,如果您查看Telerik文档,您将看到您可以通过GridViewRowEditEndedEventArgs(e.NewData)访问您在AddingNewDataItem事件中创建的对象。此外,当提交新项目时,它将自动添加到RadGridView的项目。