(一)安装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勇哥的分享

