使用 MVVM 的 WPF 导航

WPF navigation using MVVM

我想了解一些有关使用 MVVM 进行导航的信息。

问题 1:如果身份验证正常,我想打开一个全新的 window,点击登录按钮,如何在不丢失 MVVM 模式的情况下执行此操作。 (我知道简单的方法 NewWindow w = new NewWindow(), show & hide 并且它没问题)但这太可怕了以至于我都在做噩梦。我该怎么做?

Q2:我想完全重塑登录页面的恢复按钮,两个有新的文本框和两个按钮(提交恢复和取消)使用取消我想再次显示登录。我该怎么做?

我所知道的:在同一个 MainView 中有两个按钮并加载不同的视图,但按钮必须像网页一样保留在那里(这是第一次迭代中的桌面应用程序,也将发展到移动设备)。

此致,

第一个问题,你要问自己谁负责开新Window。有人可能会说 UI 负责打开一个新的 Window,不管 ViewModel 中的数据如何,因此按钮打开一个新的 Window() 是没有问题的,因为没有实际涉及的数据。您是否需要通过操作 IsClose 数据项来打开或关闭 window?我的意思是,真的,您是否发现任何您可能需要它的有用场景?那么ViewModel就会涉及到。

对于第二个问题,你按下一些按钮,然后 UI 的某些部分发生变化。您必须问自己,当您执行此操作时,ViewModel 的任何重要部分是否发生了变化,或者仅仅是使用一些 IsOpen 或 IsShown 变量来显示或隐藏一些已经连接到底层 ViewModel 的控件的情况。

Views 和 ViewModels 之间没有一对一的关系。您可能拥有多对多,或者您可以拥有一个连接到所有视图的巨大 ViewModel。 MVVM 的重点不是让 UI 以某种方式运行,而是管理应用程序的逻辑。 UI 应该以此为基础塑造自己。

WPF/XAML 是一项非凡的技术,有很多方法可以做同样的事情,即使是最简单的解释也太复杂了,无法在像 SO 这样的论坛上发表。要完全理解 WPF、MVVM 和 XAML,您需要查看示例代码和大量示例代码,您需要将其拆开并查看其工作方式,然后修改它以执行其他操作,剥离部分以在您的代码中实现自己的代码并遵循教程。只有做到 24/7/52,您才能期望熟悉它.....

我不会post这里的任何代码,因为太多了。所以这里是我能想到的最简单示例的下载

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

该示例是 Rachel Lim 示例的修改版。它只包含视图和视图模型,没有模型或数据。它演示了两个不同视图之间的切换。下载并解压缩它(使用 win RAR)您将需要单步执行代码,弄清楚它在做什么以及它是如何做的然后修改它以满足您的需要......或者修改您的需要以适应代码.. ...

也许作为您的第一个任务,使用我从下载 link 获得的示例代码,您应该尝试添加第三个视图加上 code\Button 以在三个视图之间切换....

祝你好运

如果要根据ViewModel动态切换Views,用DataTemplates比较合适:

<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的实例,则显示ViewA,而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>

并且我强烈建议您关注 Prism 框架。 This tutorial is very nice.