如何根据命令更改View + viewmodel

时间:2011-03-09 21:22:59

标签: wpf mvvm

我刚开始使用这个整个WPF的东西,需要了解一些基本元素。到目前为止,我已经了解了MVVM模式中的Model,View和ViewModel。

我没有得到的是在何处/如何基于此来修改我的UI。

假设我有一个我需要先登录的应用程序。我的登录是一个视图和一个viewmodel + model我有。显示这个没有问题,因为它的“启动”视图我只是将它添加到我的窗口的构造函数中(对或错?)。当用户成功登录时,我想将视图和视图模型更改为例如。仪表板视图+ viewmodel。我应该手动完成所有这些操作,只需删除作为登录的usercontrol,然后添加作为仪表板的其他用户控件?然后更改datacontext?这通常是如何完成的?

我担心的是我只是简单地介绍了很多代码来切换view + viewmodel,这让我感到困扰。当我从仪表板转到客户列表,再到项目列表等时,我会在我的eventhandler /命令中为按下的按钮编写这个逻辑吗?

3 个答案:

答案 0 :(得分:2)

  • 视图是UI(可以是窗口,页面,用户控件)
  • 视图模型是该视图的后端

您的登录窗口将拥有自己的视图模型,您的仪表板将拥有自己的视图模型。您不能手动切换视图模型。

因此,用户输入他/她的用户名和密码并点击输入,登录视图模型通过视图中的绑定获取数据,然后模型验证凭据,如果它们是正确的,则出现与其绑定的仪表板查看模型。

您有登录视图和视图模型+仪表板视图和视图模型+其他视图和其他控件的视图模型。

- 更新:

假设您有以下内容: - 窗口 - 登录控制 - 仪表板控件

都拥有自己的视图(V)和视图模型(VM) Window VM有两个可见性属性,Window V中的Login和Dashboard可见性属性绑定到它们。

当应用程序启动时,Login控件可见,当登录成功时,模型会告诉Window VM将Login visibility属性设置为collapsed,将Dashboard visibility属性设置为visible,然后Window VM告诉Window V隐藏Login控件并显示Dashboard控件。

“tell”表示引发事件,发送消息,调用方法 - 取决于你如何实现MVVM。

答案 1 :(得分:1)

创建包含用户控件和框架的MainPageView。将MainPageView设置为您的根视觉。然后,您可以将Frame Source绑定到MainPageViewModel中的属性。然后在登录或仪表板之间导航是向MainPageViewModel发送消息并设置框架源绑定的属性的问题。

答案 2 :(得分:0)

如果您希望视图位于另一个窗口中,则可以在每个窗口(单独的XAML)中创建视图/视图模型,并通过创建新窗口,使其可见,然后退出前一个窗口来切换它们。

但是,如果要在同一窗口中切换视图,我建议您使用自定义ContentPresenter进行切换。我在此问了一个类似的问题,你可以在这里找到:Resource management when changing window content

如果只是切换可见性,您将保留所有视图的已加载资源。使用自定义ContentPresenter,您可以换出当前内容,垃圾收集器将拾取旧内容。命令将由视图模型发送和拾取,这将更改当前视图字段(这是视图模型中的字段)。 ContentPresenter将绑定到视图模型的字段,在View Model接收命令时自动切换其内容。