我正在使用带有MVVM模式的C#中的WPF重新创建Win32(Delphi 5)屏幕。目的是创建一个演示,我可以用它来推动我的公司从Delphi 5迁移到C#。在这个演示中,我想以“正确”的方式做事,所以我们有一个很好的例子。考虑到这一点,我试图尽可能严格地遵守MVVM,这是我目前遇到问题的地方。
在原始程序/屏幕中,我们有可以附加到编辑框和网格单元的查找对话框。它的工作方式是查找对话框是特定搜索(即客户查找)的实现。将查找对话框附加到控件时,它会侦听控件的按键事件。它具有渐进式搜索功能,因此当您开始键入时,如果它能够找到以您键入内容开头的结果,则会将第一个结果插入您附加的控件中。在执行此操作时,它会将光标保持在您键入的位置,并突出显示您键入的数据部分,这样,如果您继续键入它,可以缩小结果范围,以找到您要查找的更具体的答案。对话框部分进入播放的位置是当您点击控件旁边的椭圆按钮时,或者您键入了在进行渐进式搜索时无法找到的内容。在任何一种情况下,它都会显示查找gui,它会显示所有可能的结果,提供过滤器以帮助您缩小搜索范围等。这个gui在视觉上附加到您指定的控件上。它总是会弹出您指定给它的单元格或编辑框等。
因此,当试图找出如何使用MVVM实现它时,这个查找对话框会让我失望。到目前为止,我的代码大多是纯粹的MVVM。后面的Views代码中唯一的代码是创建ViewModel并将其分配给DataContext的一行。 ViewModel不会引用视图。但是通过这个查找对话框,线条看起来有点模糊。我设想查找具有自己的ViewModel。当您查找某些内容时,比如说要放入销售订单中的项目,我们可能希望从查找中获取项目价格等信息,以便将其复制到销售订单记录中。所以要做到这一点,屏幕的主ViewModel需要知道查找的ViewModel。主屏幕的视图也需要知道查找视图,因为它必须能够将查找“附加”到gui控件,以便它可以收听按键事件并知道在需要时可视地弹出的位置要显示。我不确定查找查看的视觉位置的代码是否应该驻留在查找ViewModel中,这将完全打破MVVM概念,或者可能在查找的视图后面的代码中,这会使视图的纯度变得混乱,因为现在View不仅仅是XAML。
原始查找在创建后,将被赋予对它应该附加到的控件的引用。然后它会将其对象中的函数附加到按键和按钮单击事件(我们的编辑框可以内置按钮)。当它被告知弹出时,它会找出它附加的控件的当前位置,以便它可以找出放置自己的位置。在将它附加到网格的情况下,它实际上是附加到网格的列,因为只有一个查找实例,它会找出网格中应该弹出的单元格的当前位置在...之下。
在保持MVVM领域的同时,最好的方法是什么?我真的想保持尽可能“纯粹”,所以我可以稍后再回来为程序中的ViewModel添加集成和可能的单元测试,这些应该是“无头”的ViewModel(没有View)。
为了更容易理解我想要实现的目标,我已经包含了我正在为我的演示重新创建的屏幕图片,并显示了查找信息。