(一)安装Prism包,及vs的创建Prism项目模板
安装nuget包: Prism.DryIoc
安装Prism的项目模板:
关闭VS,会继续安装。
安装完成后,vs有了Prism的项目模板。
我们选择创建Prism Full App(WPF), 在弹出来对话框中选择“DryIoc”容器,这个是默认值。
还有一个可选容器是Unity。
创建好的工程如下:
在这些项目中,执行程序上FullApp1,用的是.NET6.0, Tests是个单元测试项目,FullApp1.Core是类库,使用是.NET6.0
其它的类库都是引用的.net startdard2.0
也就是说,Prism Full App(WPF) 这个模板是创建的.net Core项目,并不是.net Framework的项目。
(二)基本示例,切换模块
本例子演示目的:
1。 演示Prism的ViewModelLocator.AutoWireViewModel机制,它用于把view和viewModel自动绑定起来
2。 做为反面教程,突显后面讲解的Prism的区域功能。
由于Prism是MVVM的框架,继续之前勇哥先谈一个mvc和mvvm的不同之处:
MVVM
Model, 承载数据
View, 显示数据
ViewModel 干活的
MVC
Model 承载数据
View 显示数据
Control 干活的
两者看上去差不多,但是工作逻辑不一样
mvc中,是control干完活后交给View来显示。
在mvvm中不是这样的,它使用的一种数据绑定的机制,把view和viewModel绑定起来,
使得viewModel一更新则view会自动更新。
这种机制就是Prism的ViewModelLocator.AutoWireViewModel机制。
我们以第(一)节创建的Prism Full App(WPF) 模板开始。
(2.1)先创建3个view,使用wpf用户控件
三个页面随便显示点文字,以示区别即可。
(2.2)创建view\MainWindow.xmal界面
我们的需求就是在这个界面里,点击模块按钮,会载入对应的模块。
对三个按钮及ContenControl控件做了Command的绑定。
<Grid> <Grid.RowDefinitions> <RowDefinition Height="40"/> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal"> <Button Command="{Binding OpenCommand}" CommandParameter="ViewA" Height="30" Width="70" Content="模块A" Margin="5"/> <Button Command="{Binding OpenCommand}" CommandParameter="ViewB" Height="30" Width="70" Content="模块B" Margin="5"/> <Button Command="{Binding OpenCommand}" CommandParameter="ViewC" Height="30" Width="70" Content="模块C" Margin="5"/> </StackPanel> <ContentControl Grid.Row="1" Content="{Binding Body}"/> <!--<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ContentRegion}" />--> </Grid>
(2.3) MainWindowViewModel里添加功能
主要是添加是上面步骤中的两个Command绑定项目。
一个是OpenCommand,一个是Body。
public class MainWindowViewModel : BindableBase { public DelegateCommand<string> OpenCommand { get; private set; } private string _title = "Prism Application"; public string Title { get { return _title; } set { SetProperty(ref _title, value); } } private object body; public object Body { get { return body; } set { SetProperty(ref body, value); } } public MainWindowViewModel() { OpenCommand = new DelegateCommand<string>(Open); } private void Open(string obj) { switch (obj) { //注意是Body,而不是body case "ViewA": Body = new ViewA(); break; case "ViewB": Body = new ViewB(); break; case "ViewC": Body = new ViewC(); break; } } }
运行:
本文源码下载:
链接:https://pan.baidu.com/s/13QK4Di-W7VKfYKu23hZ__A
提取码:w23k
--来自百度网盘超级会员V6勇哥的分享

