在MVVM和松耦合之后从MainWindow打开第二个窗口

Th1sD0t

首先:此应用程序和问题是出于学习目的

我在一个新的应用程序上,并且遇到用户在MainView中单击“按钮”时想打开一个窗口的问题。在过去,我曾设计过一个命令,该命令仅创建并显示新窗口

new RelayCommand((x)=>new SecondWindow().Show());

现在,通过这个新项目,我试图将所有类彼此完全分离。为实现此目的,我的应用程序包含4个程序集(BL,COM,DAL和UI)。与每个WPF应用程序一样,该应用程序从MainWindow.xaml开始。MainWindow.cs将创建它的MainWindowViewModel实例:

public ViewModel VM {get; private set;}
public class MainWindow(){
    VM = new ViewModel();
    InitializeComponent();
}

(已经违反了松散耦合)(关于如何使其变得更好的任何技巧?)

我最后的尝试是在主窗口中创建第二个Window的实例

<Window.Resources>
    <local:SecondWindow x:Key="sw"/>
</Window.Resources>

并将其作为CommandParameter传递给我的Command

CommandParameter="{StaticResource sw}"/>

new RelayCommand((x)=> ((Window)x).Show());

此解决方案有效,但有一个很大的缺点-在应用启动后立即创建第二个窗口-它的ViewModel也启动了一些繁重的过程(数据库连接等)

我听说过IoC原理,但是我真的不知道如何在wpf应用程序中使用它。

蒙蒂

您正在沿着正确的方向思考...。基本上,您必须在应用程序启动时创建一个ViewModels列表,然后您可以在用户按下按钮时在它们之间进行切换,并将ViewModel的名称作为CommandParameter传递给Command。经理...

您可能会找到此链接到Rachel Lim的博客

https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

另外,我不会在这里发布任何代码,因为它太复杂了。所以这里是我想出的最简单示例的下载

http://www.mediafire.com/download/3bubiq7s6xw7i73/Navigation1.rar

下载并解压缩它(与win RAR一起使用)您将需要逐步检查代码,弄清楚它的作用以及它的作用,然后根据您的需要对其进行修改...,或根据您的需要对其进行修改。 ...

该示例是Rachel Lim示例的修改。它仅包含Views和ViewModels,没有Models或数据。它演示了在两个不同视图之间的切换。

更新1

具体参考演示代码...。将您的VM添加到VM的静态集合中(请参见AddViewModel函数),例如,通过单击按钮来选择每个视图(DataTemplate将View与ViewModel关联),例如,通过调用“ SelectViewCommand”,依次将Current_ViewModel设置为选定的ViewModel ...相应的ContentControl然后更新以显示当前选定的View ...

我知道这很混乱,很难解释

当您按下按钮以“更改视图”时,您实际上是在更改ContentControl绑定到的属性的值,因此您也必须在ContentControl绑定到的类的SAME实例中调用正确的SelectViewCommand。

在演示中,您将在“ LogOn_View”中看到

 Command="{Binding DataContext.SelectViewCommand, ElementName=Base_V}"CommandParameter="Main_ViewModel"

在这里,我在Base_ViewModel中调用SelectViewCommand(在Base_View XAML中为x:Name =“ Base_V”),这是因为我想更改在Base_View的“ ContentControl”中显示的视图

在Main_View中,我打电话

 Command="{Binding SelectViewCommand}" CommandParameter="MainV1_ViewModel"

在这里,我在Main_ViewModel中调用SelectViewCommand,这是因为我想更改显示在MainView的“ ContentControl”中的View。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从第二个窗口访问 MainWindow 的变量

使用pyqt5和qt designer从主窗口打开第二个窗口

Python 打开第二个窗口。为什么?

关闭在MainWindow WPF中创建的第二个窗口

JavaFX 在第一个窗口之后显示第二个窗口

打开对话框或创建窗口时,tkinter将打开第二个窗口

如何从pyqt中的第一个窗口打开第二个窗口?

PyQt5从主窗口打开第二个窗口

WPF禁用主窗口,而第二个窗口打开直到关闭

更新到13.10之后:打开盖子后的第二个待机状态

多线程:chromedriver无法在第二个窗口中打开url

如何在 Eclipse 中打开第二个包浏览器窗口?

gedit 在新窗口中打开第二个文件。Ubuntu 19.10

在第二个窗口丢失的菜单栏中打开JFrame

如何在OneNote 2019 / Windows 10中打开第二个窗口?

方法运行时打开第二个窗口-WPF

Javafx:在按钮上单击打开第二个选择窗口

从 kivy.core.window 导入 Window 会打开第二个崩溃的 Kivy 窗口

OS X第二个窗口将保持打开状态

Visual Studio - 如何使用设计器打开第二个窗口?

WebDriverError:未知错误,同时使用 Selenium(Javsacript)打开第二个边缘窗口

C ++窗口应用程序随附加窗口一起打开。如何摆脱第二个窗口?

Yii和Bootstrap小部件在第二个Ajax之后不起作用

在第二个`/`之后存储所有内容

Perl在第二个元素之后加入数组

在第二个元素之后添加元素

FROM表格之后的第二个表格名称

如何在WPF中从第一个窗口打开第二个窗口?

WebStorm:第二个项目窗口在第一个项目窗口后面打开