首先:此应用程序和问题是出于学习目的
我在一个新的应用程序上,并且遇到用户在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] 删除。
我来说两句