C# 是否在新ViewModel可用时打开新视图?

C# 是否在新ViewModel可用时打开新视图?,c#,wpf,mvvm,C#,Wpf,Mvvm,我对WPF/MVVM比较陌生。我们当前的WPF项目仍然是一个原型应用程序,这意味着我们还没有开始设计主布局。但是我们确实设计了一些报告(所谓报告,我指的是一些相当复杂的UserControl,其中每个都有一些配置控件,例如ComobBox或TextBox,以及一些DataGrid,图形控件,用于我们想要呈现的数据)作为视图及其视图模型。它仍然是原型,所以我们只需要打开一个新的窗口,其中显示这些用户控件。将来,我们可能会将其更改为在主窗口内的不同区域中定位不同的UserControl,如Visua

我对WPF/MVVM比较陌生。我们当前的WPF项目仍然是一个原型应用程序,这意味着我们还没有开始设计主布局。但是我们确实设计了一些报告(所谓报告,我指的是一些相当复杂的
UserControl
,其中每个都有一些配置控件,例如
ComobBox
TextBox
,以及一些
DataGrid
图形
控件,用于我们想要呈现的数据)作为
视图
及其
视图模型
。它仍然是原型,所以我们只需要打开一个新的
窗口
,其中显示这些
用户控件
。将来,我们可能会将其更改为在主窗口内的不同区域中定位不同的
UserControl
,如VisualStudio的布局。主要的一点是,我们的应用程序将包括将近一百个这样的
UserControl
,或者我们称之为报告的内容。因此,它不同于我以前的工作项目,它具有静态布局/主视图

我还没有为它找到一个好的架构。我们的经典使用场景是让用户在菜单中选择要打开的报表,因此我们有
命令
(在MainViewModel或报表的任何ViewModel中)对象来打开新报表。因此基本上,
命令
正在生成一个新的
ViewModel
ViewModel
第一种情况),然后应该生成一个相应的
视图
(由谁生成?),最后应该打开一个新的
窗口
,包括新生成的
UserControl

我想我需要两种服务:

  • 订阅新ViewModel生成的事件,并在此类事件发生时解析
    UserControl
    的服务

  • (对于我们当前的原型应用程序)一个窗口管理器,它订阅由1)服务发布的新UserControl生成的事件,然后打开一个新窗口来显示它

  • 在未来的实际应用中,我们可以改变服务,把它们放到不同的地区。对于第二个,它很简单,而且只是临时的,我可以在MainView的代码隐藏中有一个对象,它使用
    EventAggregator
    订阅事件,并生成一个新的
    窗口
    。对吗


    有人能告诉我应该如何实现这一点吗?

    数据绑定已经可以为您解决这一问题了。在要显示报告的容器中,添加一个
    ContentControl
    ,并将其绑定到一个属性,该属性保存当前要显示的报告的VM

    <Window>
      <ContentControl Content="{Binding Path=CurrentReport}" />
    </Window>
    

    约翰·伯恩击败了我,因为我认为我仍然会发帖,也许会有帮助

    要将视图与视图模型关联,可以使用资源字典中的数据模板

    <DataTemplate DataType="{x:Type vm:AllCustomersViewModel}">
        <vw:AllCustomersView />
    </DataTemplate>
    
    
    
    您可能已经知道,可以在资源字典中设置名称空间。在本例中,vw和vm分别引用包含viewmodels和views的文件夹。 现在,您可以使用内容控件通过绑定到视图模型来生成视图

    <ContentControl Content="{Binding SomeViewModel}" />
    
    
    
    上面的代码被无耻地从btw偷走了

    因此,您不需要服务来解析视图与viewmodel的关联。让框架为您完成工作。
    实际上,我不建议打开新窗口。如果必须,使用“窗口控制器”——某种服务将不可避免。但是,我建议您坚持使用包含多个ViewModel的单个窗口,并在收到某些事件时交换它们

    看看MEF:。它可以作为第一个服务(View可以导入ViewModel)@amnezjak可能是我没有正确理解它。但我觉得我们的应用程序更像是一个
    ViewModel
    ——第一个,例如,一个
    ViewModel
    中的一个
    命令
    对象被执行并生成另一个不同的
    ViewModel
    ,我需要为它解析
    视图
    。但是在您的方案中,
    视图
    导入了
    视图模型
    。顺便说一句,在这种情况下,谁负责生成
    视图
    ?谢谢您的回复。我还有一个问题:既然我们至少有100个这样的报告/
    UserControl
    ,那么
    DataTemplate
    ReSources
    对于这个场景来说是一个好的选择吗?正如我提到的,虽然目前我们在单个窗口中显示每个报告,但我们将在实际应用程序中通过设置一些窗口并在不同区域分配不同的报告来更改它。这个
    DataTemplate
    方法是通用的,这样我们就可以实现它吗?两者都是。您需要确保使用这么多模板来组织所有内容,但这并不是此解决方案所独有的。它特别适合于更改容器,因为您只需要放置一个ContentControl元素就可以了。谢谢您的回复。你能给我举一些这样的窗口控制器的例子吗?因为正如我所暗示的,我们的软件包括数百个报告,并且通常同时打开多个报告。我们的传统软件是MDI(多文档接口)。除非我们能想出一些不同的和适当的布局,我的感觉是在新的WPF应用程序中,我们仍然希望遵循这样的UI布局。例如,Visual Studio的主布局(一次只显示一个文档的表格控件)是不可取的。另外,我提到我们当前的WPF应用程序只是一个原型,这就是为什么我们在各个窗口中打开不同的报告。将来,我们希望以不同的方式使用
    视图
    ViweModel
    。那么
    DataTemplate
    方法是在该场景中使用的一种好方法吗?我的感觉是这种方法不够灵活。。。
    <ContentControl Content="{Binding SomeViewModel}" />