我正在使用MVVM模式构建我的第一个WPF.在这个社区的帮助下,我设法创建了我的模型,我的第一个ViewModel和视图.现在我想为设计基本应用程序布局界面的应用程序添加一些复杂性.我的想法是至少有2个子视图和一个主视图,并将它们分成几个XAML:
- Main.XAML
- Products.XAML
- Clients.XAML
Main将有一个菜单和一个空间来加载子视图(产品和客户端).现在遵循MVVM模式,视图之间的所有导航逻辑都应该在ViewModel上写入.所以mi想法是拥有4个ViewModel:
- MainViewModel
- ProductsViewModel
- ClientsViewModel
- NavigationViewModel
那么NavigationViewModel应该包含一个子视图模型的集合?一个活跃的viewmodel是吗?
所以我的问题是:
1)如何使用MVVM模式在主视图上加载不同的视图(产品,客户端)?
2)如何实现导航viewModel?
3)如何控制打开或活动视图的最大数量?
4)如何在打开的视图之间切换?
我一直在做大量的搜索和阅读,并且找不到任何简单的MVVM导航示例,其中WPF在主视图中加载了多个视图.许多人:
1)使用外部工具包,我现在不想使用它.
2)将所有视图的所有代码放在一个XAML文件中,这似乎不是一个好主意,因为我需要实现近80个视图!
我在这里正确的道路?任何帮助,特别是一些代码将不胜感激.
UPDATE
所以,我按照@LordTakkera的建议建立了一个测试项目,但是卡住了.这就是我的解决方案的样子:
我创造:
两种型号(客户和产品)
一个MainWindow和两个wpf用户控件(客户端和产品)XAML.
三个ViewModel(客户端,产品和主ViewModel)
然后我将每个视图上的dataContext设置为相应的viewModel.之后,我使用ContentPresenter创建MainWindow,并将其绑定到viewmodel的属性.
MainWindow.XAML
<Window x:Class="PruevaMVVMNavNew.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="519" Width="890">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="*"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<Border Grid.Column="0" Grid.ColumnSpan="2" Background="AntiqueWhite" ></Border>
<Border Grid.Row="1" Grid.RowSpan="2" Background="AliceBlue"></Border>
<Border Grid.Row="1" Grid.Column="1" Background="CadetBlue"></Border>
<ContentPresenter Grid.Row="1" Grid.Column="1" x:Name="ContentArea" Content="{Binding CurrentView}"/>
<StackPanel Margin="5" Grid.Column="0" Grid.Row="1">
<Button>Clients</Button>
<Button>Products</Button>
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这也是来自MainWindow的viewmodel:
class Main_ViewModel : …
Run Code Online (Sandbox Code Playgroud) 我想隐藏ListBox的边框,并使所选项目的背景与未选择的项目相同.
我该怎么做呢?