MVVM WPF更改窗口并关闭上一个窗口



作为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"。因此,我建议您使用流行的技术,可以使用ContentControlDataTemplate更改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.DataContextViewModelA的实例,则显示View0,而Window.DataContextViewModelB的实例,那么显示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()

相关内容

  • 没有找到相关文章

最新更新