2016-04-07 18 views
0

在第一第二个窗口:这个App和问题是学习的目的打开从主窗口下面的MVVM和松耦合

我在一个新的应用程序和面向我想开一个窗口的问题,当用户单击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.Resources> 
    <local:SecondWindow x:Key="sw"/> 
</Window.Resources> 

内第二个窗口,并把它作为一个CommandParameter我的指挥

CommandParameter="{StaticResource sw}"/> 

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

该解决方案的工作,但有一个很大的缺点 - 第二个窗口中获取的创建的应用程序启动后,立即 - 也是如此它的ViewModel其开始有些沉重流程(DB连接等)

我听说过一些关于云燕的IoC原则但我真的不知道如何在wpf应用程序中使用它。

回答

1

您正在思考沿着正确的路线......当您的应用程序启动时,您基本上必须创建一个ViewModel列表,然后您可以在用户按下按钮并将ViewModel的名称作为CommandParameter您的命令处理程序....

您可能会发现此链接雷切尔林的博客

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

而且,我不打算在这里发表任何代码怎么把它简单地变得太复杂了。因此,这里是一个下载到只是最简单的例子,我可以拿出

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

下载和非RAR它(与Win RAR)您将需要步骤尽管代码,找出它做以及如何修改它以适应您的需求...或修改您的需求以适应代码.....

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

UPDATE 1

具体参考演示代码....你的虚拟机被添加到虚拟机的静态集合(见AddViewModel函数),每个视图(DataTemplate中联营查看与视图模型)被选择时例如,通过调用'SelectViewCommand'来点击一个按钮,然后SelectViewCommand将Current_ViewModel设置为选定的ViewModel ...相应的ContentControl将被更新以显示当前选择的View ...

我所知道的是混乱和很难解释

当你按下一个按钮,“更改视图”你实际上是在不断变化的,你ContentControl中绑定到财产的价值,所以你要调用正确的SelectViewCommand在你的ContentControl中太束缚类的同一个实例...

在演示中,你会看到在“LogOn_View”我叫

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

在这里,我呼吁在SelectViewCommand Base_V iewModel(X:NAME = “Base_V” 在Base_View XAML),那是因为我想改变这种状况显示在查看Base_View的 'ContentControl中'

在Main_View我打电话

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

这里我打电话在Main_ViewModel中的SelectViewCommand,这是因为我想要更改显示在MainView的'ContentControl'中的视图....

+0

所以,如果我理解这一点我不该我的MainView从我的UI项目的其余部分分开,并使用它的视图模型来承载所有其他的ViewModels ?我会试试这个,但乍一看它看起来并不像我想要的解决方案。说实话,我有点困惑,因为在某些点上我不安静肯定在哪个项目(UI,BL,COM等)来存储我的课 - 让我的UI项目需要BL和COM引用。 – C4p741nZ

+0

好吧,我看了一下它,现在我真的很困惑。我有几个虚拟机(让我们假设2)。每个VM都有一个View。在我的MainView中,我定义了如何显示特定的虚拟机(DataTemplate)。但是,在给定的例子中,我没有看到我的第二个窗口中可以如何访问它的虚拟机的属性(绑定)。在这个例子中一个按钮只是绑定到“SaveProductCommand” - 但如何查看知道SaveProductCommand位于ProductsViewModel代替ApplicationViewModel里面? – C4p741nZ

0

我通常创建一个WindowService类来管理MVVM中的窗口更改/对话框。在视图模型(即Window.Show())有“查看”代码违背MVVM原则。例如:

public class WindowService : IWindowService 
{ 
    public void ShowDialog<T>(ViewModelBase viewModel) where T : IApplicationDialog 
    { 
     IApplicationDialog dialog = (IApplicationDialog)Activator.CreateInstance(typeof(T)); 

     dialog.Show(); 
    } 
} 

然后从视图模型您的通话将看起来像:如果您使用DI

windowService.ShowDialog<SecondWindow>(new SecondWindowViewModel()); 

,你可以传递给IoC容器引用到窗口服务创建的窗口实例,而不是使用Activator.CreateInstance(我更喜欢亲自DI方法)