C# WPF MVVM关于弹出式搜索的建议

C# WPF MVVM关于弹出式搜索的建议,c#,wpf,mvvm,C#,Wpf,Mvvm,我是WPF MVVM模型的新手,所以请容忍我。我想写一个库存管理系统。我有一个成功链接到viewmodels的维护页面。但是,我想启用一个搜索控件,我可以从维护页面触发该控件,以弹出一个网格,用户可以在其中搜索项目,选择它并返回维护屏幕,同时显示所选项目 在MVVM中实现这种功能的最佳方式是什么?维护屏幕上的搜索按钮可以链接到搜索图标命令,但Viewmodel不知道UI,因此不知道显示搜索控件的名称或如何显示。我唯一能想到的是在UI上编写代码隐藏的search button事件,但这是否打破了M

我是WPF MVVM模型的新手,所以请容忍我。我想写一个库存管理系统。我有一个成功链接到viewmodels的维护页面。但是,我想启用一个搜索控件,我可以从维护页面触发该控件,以弹出一个网格,用户可以在其中搜索项目,选择它并返回维护屏幕,同时显示所选项目

在MVVM中实现这种功能的最佳方式是什么?维护屏幕上的搜索按钮可以链接到搜索图标命令,但Viewmodel不知道UI,因此不知道显示搜索控件的名称或如何显示。我唯一能想到的是在UI上编写代码隐藏的search button事件,但这是否打破了MVVM模式


如果这是一个愚蠢的问题,请提前感谢,并表示歉意。

为了避免UI和viewmodels之间的直接耦合,我以前使用了将新UI元素的创建转发回UI类。然而,我从未完全相信这种方法,因此我很想看看是否有人有更好的解决方案。

解决问题的一个好方法是使用

就MVVM模式而言,视图模型负责启动与用户的交互,并使用和处理任何响应,而视图则负责使用任何适当的用户体验实际管理与用户的交互。保持视图模型中实现的表示逻辑与视图实现的用户体验之间的关注点分离,有助于提高可测试性和灵活性

在MVVM模式中,有两种常见的方法来实现这些类型的用户交互。一种方法是实现视图模型可以用来启动与用户交互的服务,从而保持其对视图实现的独立性。另一种方法使用视图模型引发的事件来表达与用户交互的意图,以及视图中绑定到这些事件并管理交互的视觉方面的组件


这是一种用于执行DialogServices等的MVVM模式。因此它也将符合您的要求。

这里的主要问题是如何以MVVM友好的方式显示搜索弹出窗口。我的github帐户上有一个自定义控件,它就是为此而设计的(完整的源代码可供下载)

控件可以这样使用:

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}">

    <!-- This is the main content e.g. your maintenance screen -->
    <TabControl Margin="5">
            <Button Margin="55"
                    Padding="10"
                    Command="{Binding ShowModalContentCommand}">
                This is the primary Content
            </Button>
        </TabItem>
    </TabControl>

    <c:ModalContentPresenter.ModalContent>
        <!-- This is the modal content e.g. your search popup -->
        <Button Margin="75"
                Padding="50"
                Command="{Binding HideModalContentCommand}">
            This is the modal content
        </Button>
    </c:ModalContentPresenter.ModalContent>

</c:ModalContentPresenter>

这是主要内容
这是情态内容
模态内容直接显示在主内容(在您的情况下是维护屏幕)上,其可见性由
IsModal
属性控制,该属性可以绑定到viewModel中的属性。该属性将通过search命令设置为true,并且您的搜索网格将显示在维护屏幕的前面

您的搜索屏幕“视图”将有一个关闭按钮,该按钮绑定到另一个ICommand对象,该对象仅将属性设置为false并隐藏弹出内容


请注意,无需“传递”任何信息,因为主内容和模式内容都由同一控件管理,因此它们共享相同的
DataContext
,在您的情况下,这将是对viewModel的引用。

如果您在编写弹出窗口时指的是对话框,那么我将使用类似的对话框服务

在维护视图模型opencommand中:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);//in your case the viewmodel for your search

//check the result and just take the SelectedItem from your dialogwindowVM
if(result)
  this._selected = dialogwindowVM.MySelectedItem;

实际上,将一段代码放在代码后面并不会破坏模式。MVVM的关键是能够在不存在veiw的情况下对视图逻辑(viewmodel)进行单元测试。感谢Benjamin,我在我的库存维护屏幕上成功地实现了这一点。非常好。我很高兴其他人能够使用它。