使用 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.DataContext
是ViewModelA
的实例,则显示ViewA
,而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>
并且我强烈建议您关注 Prism 框架。 This tutorial is very nice.
我想了解一些有关使用 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.DataContext
是ViewModelA
的实例,则显示ViewA
,而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>
并且我强烈建议您关注 Prism 框架。 This tutorial is very nice.