ListView使用ItemsSource绑定到ObservableCollection之后,内部ListViewItem元素的Command绑定时(例如鼠标左键单击触发命令),如何找到合适的DataContext是个问题。一般以前使用FindAncestor等方式,找到ListView的DataContext对应的View Model,然后在View Model中处理该Command。
现在使用了一种新做法,为ItemsSource中的每一个项的类设定为partial 类,然后就可以在View Model对应的项目中扩展元素类,这样直接在内部完成一些简单的操作了。
暂且称这种方式为“在模型类中处理Command”。
不过这样的方式只适合于同一个项目代码内部,因为partial类是编译器为每一个模块单独开放的小权限,最后他们都会被合并在一个模块中,所以不能跨越模块写partial代码。
用静态this扩展Class的方式不适用于添加ICommand处理器。
最直接的方式可能就是继承。不过继承的局限性还是比较多的。尤其在某些C/S数据通信交互程序中,不能要求底层代码都是用最后继承的类型。
现在采用的是定义delegate回调。虽然中间可能会经历多一两层的回调,但可以实现我们需要的直接在模型类中处理Command的方式。最终仍然回到View Model类中进行最后的处理。