作为MVVM所有体系结构的初学者,我对从一个窗口到另一个窗口的导航有一些疑问。我使用的是Framework MVVM Light。
我期望的行为在WinForms中是这样的:
GeneralWindow gw=新的GeneralWindow();这隐藏();//或关闭gw.Show();
我已经花了几个小时试图使用信使找到一些提示,但我发现的方法必须在视图中使用代码,这不是很MVVMish。
提前向您致以最良好的问候和感谢。
我期望的行为在WinForms中如下:
GeneralWindow gw = new GeneralWindow(); this.Hide(); // or close gw.Show();
MVVM模式将CCD_ 1与CCD_。因此,它没有资格从ViewModel
创建新的View
创建窗口实例并从视图模型中显示窗口违反了MVVM"。因此,我建议您使用流行的技术,可以使用ContentControl
和DataTemplate
更改Views
。
让我们深入了解这项技术:
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
如果Window.DataContext
是ViewModelA
的实例,则显示View
0,而Window.DataContext
是ViewModelB
的实例,那么显示ViewB
。
让我展示一个例子,在那里可以看到你应该把DataTemplates
:放在哪里
<Window x:Class="SimpleMVVMExample.ApplicationView"
...The code omitted for the brevity...
Title="Simple MVVM Example with Navigation" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
</Window.Resources>
<DockPanel>
<Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0">
<ItemsControl ItemsSource="{Binding ListOfViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Margin="2,5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<ContentControl Content="{Binding CurrentDataTemplateViewModel}" />
</DockPanel>
</Window>
我看过和读过的最好的例子是Rachel Lim做的。请参见示例。
更新:
如果您真的想打开新窗口,那么您应该创建一个中间层,使ViewModel不依赖于创建新窗口的具体实现。
public class YourViewModel
{
private readonly IWindowFactory windowFactory;
private ICommand openNewWindow;
public YourViewModel(IWindowFactory _windowFactory)
{
windowFactory = windowFactory;
/**
* Would need to assign value to m_openNewWindow here, and
* associate the DoOpenWindow method
* to the execution of the command.
* */
openNewWindow = null;
}
public void DoOpenNewWindow()
{
windowFactory.CreateNewWindow();
}
public ICommand OpenNewWindow { get { return openNewWindow; } }
}
public interface IWindowFactory
{
void CreateNewWindow();
}
public class ProductionWindowFactory: IWindowFactory
{
#region Implementation of INewWindowFactory
public void CreateNewWindow()
{
NewWindow window = new NewWindow
{
DataContext = new NewWindowViewModel()
};
window.Show();
}
#endregion
}
如何关闭窗口
有很多方法。。其中之一是:
Application.Current.MainWindow.Close()