C# MVVM Light-多视图模型(并将其连接起来)

C# MVVM Light-多视图模型(并将其连接起来),c#,.net,wpf,mvvm,views,C#,.net,Wpf,Mvvm,Views,我正试图学习MVVM模式(C#),它来自Windows窗体背景。我正在使用MVVM Light工具包,到目前为止,我认为它非常出色。 我已经做了几个小的应用程序,但是有一件事我正在努力引入第二个视图 我想(例如)在我的MainViewModel上有一个按钮,它通过一个RelayCommand打开一个新窗口——比如说一个“关于”窗口。我在网上为此做了数小时的研究,但似乎我无法让我的AboutView模型与我的AboutView进行交流/显示我的AboutView 我在AboutView.xaml的

我正试图学习MVVM模式(C#),它来自Windows窗体背景。我正在使用MVVM Light工具包,到目前为止,我认为它非常出色。 我已经做了几个小的应用程序,但是有一件事我正在努力引入第二个视图

我想(例如)在我的MainViewModel上有一个按钮,它通过一个RelayCommand打开一个新窗口——比如说一个“关于”窗口。我在网上为此做了数小时的研究,但似乎我无法让我的AboutView模型与我的AboutView进行交流/显示我的AboutView

我在AboutView.xaml的代码隐藏构造函数中放置了一个接收信使,但是我无法让它接收来自AboutView模型的任何消息,因此无法使其“Show()”


如果有人有一个使用多个视图的Mvvm Light WPF应用程序的例子,那就太好了:)

正如我所见,你想在你的Mvvm应用程序中导航吗

有人向
MVVM Light
-Laurent Bugnion-的创建者透露了关于使用导航服务切换
视图的信息。它实际上是关于Windows PhoneSilverlight的,但同样的情况也应该适用于WPF


相关问题中也使用了这种方法。

我认为有两种方法可以轻松做到这一点

第一种方法是使用
弹出窗口
,而不是新的
窗口
。例如,我经常在我的
ViewModel
中为
PopupContent
ispopupvvisible
设置属性,并在任何时候显示我的
Popup
控件时设置这些值。例如,
ShowAboutPopup
relay命令可能运行以下命令:

void ShowAboutPopup()
{
    PopupContent = new AboutViewModel();
    IsPopupVisible = true;
}
<Window>
    <Canvas x:Name="RootPanel">
        <SomePanel>
            <!-- Regular content goes here -->
        </SomePanel>

        <local:PopupPanel Content="{Binding PopupContent}"
            local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"
            local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" />
    </Canvas>
</Window>
您可以使用
弹出窗口
对象或自定义
用户控件
来显示它。我更喜欢使用我自己的,结果通常是这样:

void ShowAboutPopup()
{
    PopupContent = new AboutViewModel();
    IsPopupVisible = true;
}
<Window>
    <Canvas x:Name="RootPanel">
        <SomePanel>
            <!-- Regular content goes here -->
        </SomePanel>

        <local:PopupPanel Content="{Binding PopupContent}"
            local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"
            local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" />
    </Canvas>
</Window>
另一种方法是让某种
ApplicationViewModel
在启动时运行,并负责整个应用程序状态,包括打开的窗口

通常我更喜欢使用一个包含
ContentControl
ApplicationView
来显示当前页面

<Window>
    <ContentControl Content="{Binding CurrentViewModel}" />
</Window>

但是,它也可以用于管理多个窗口。如果您确实使用它来管理多个
窗口
对象,请注意,这将不是纯粹的
视图模型
,因为它需要访问一些视图特定的对象,并且引用UI对象不是
视图模型
应该做的事情。例如,它可以订阅接收
ShowWindow
消息,在接收到这些消息后,它将创建指定的视图并显示它,还可能隐藏当前窗口


就我个人而言,我尽量避免使用多个窗口。我通常的方法是使用一个视图,其中包含任何页面的一致应用程序对象,以及一个
ContentControl
,其中包含更改的动态内容。如果您感兴趣,我有一个建议

您的一些代码将非常有助于找到答案。。。