如何在MVVM中处理Wpf DataGrid的CellEditEnding事件?

6

MVVM不允许使用代码后台和事件处理。那么,MVVM如何通知单元格已更改?


对我来说,这似乎是一个合法的问题,但也许你需要在问题上更详细一些:你到底不明白如何处理该事件?你想知道它应该在视图还是视图模型中完成吗?(提示:视图模型不应该了解关于 DataGrid 的任何信息。) - slugster
@slugster - 显然我不能使用这个事件,因为MVVM不允许Code Behind。那么我的问题是,我可以用什么来替代这个事件? - Erez
2
MVVM并不“禁止”代码后置,它只是“不鼓励”,并为您提供了一种实现该理想的模式。一旦数据表格单元格被更改,您需要做什么(您的答案可能决定采取的方法)? - slugster
4个回答

1

这是一个相当合理和明显的问题,因为对于MVVM问题有相当合理的解决方案。我猜有人将其标记为负面评价,因为这可能已经被问了无数次。

我知道在.Net4中有内置的方法来做到这一点。但我卡在了.Net3.5上,所以我使用WPF工具包中的CommandReference类,将视图中的事件转换为视图模型中的命令。


MVVM的问题的解决方案是处理事件,我认为。 :) - Greg D
但是问题在于“如何”!您不能在破坏MVVM的情况下添加事件处理程序。命令引用可让您将UI中的事件转换为VM中的命令。 - NVM

0

"MVVM 不允许代码后台和事件处理。"

哎呀!这就是问题所在。

MVVM 确实不鼓励使用代码后台,但只有当可以通过 Xaml 合理完成某些事情时才会这样做。"不要使用代码后台" 从来没有被任何有头脑的人说过。

有时处理事件是实现目标最简单、最好的方法。当出现这种情况时,接受它,解决问题,然后继续前进。有时甚至无法在 XAML 中实现目标。在这种情况下,将视图逻辑放在视图的代码后台中,然后继续前进。

保持 MVVM 的架构目标(层之间的关注点分离)比严格遵守经验法则(如避免使用代码后台)更为重要。如果没有做出这种区分,你就会看不到森林而只看到树木。


你说的有对也有错。如果你只是为了做一些纯粹的UI操作而在后面添加一些代码,那么这是可以的。但是,如果单元格编辑结束事件将通过你的VM更新模型中的某些内容,那么这是一个非常糟糕的想法(在我看来)。 - NVM
这取决于您的模型是否适合在DataGrid中工作。例如,在我目前的@work情况下,我被迫使用单行datagrid来表示单个项目。 VM不会公开包含仅能包含一个实例的这些项目的集合,这将是VM方面对V中奇怪需求的荒谬让步。相反,V有责任将VM公开的实际应用程序需求转化为所需的内容。 - Greg D
我不确定我理解你的情况。但是我不同意“视图负责转换VM公开的内容”的说法。视图负责“显示”VM公开的内容。VM负责转换模型。视图应该仅根据用户请求要求VM转换模型中的内容。视图没有转换模型中任何内容的业务,这完全是VM的责任。而VM的存在正是因为模型不适合直接用于工作视图(如datagridview)。 - NVM
而且为了增加一些内容,我会将用户控件模板化,使其像数据网格行一样运作,而不是为单个项目添加数据网格。 - NVM
ViewModel 可以通过枚举(例如,pass-warning-fail)公开状态,但视图负责将该枚举转换为视觉提示(颜色、字形等)。这就是我所说的视图负责转换 VM 公开内容的意思。 - Greg D
那么我同意。如果虚拟机暴露了某些东西,那么视图可以决定以任何方式表示它。但是,在许多情况下,您需要在单元格编辑结束时转换模型。这就是您需要CommandReference类的地方。 - NVM

0

由于此问题从未被标记为答案;您需要的是“事件到命令”实现。基本上,它捕获您选择的事件并在ViewModel上调用ICommand实现。

这里已经有了答案总结(请查看Derek Beattie的答案)。


0
你需要处理CellEditEnding事件吗?在与单元格绑定的属性的setter中执行代码是否可行?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接