本文主要做Prism框架当中的指定视图绑定的上下文ViewModel,做如下方式
- 注册视图时指定命名空间
- 使用ViewModelLocator 自动查找或是自定义搜索方式
- 指定控件容器的DataContext、或是指定控件的ViewModel
注册视图时指定命名空间
基础不过多介绍! 在将App类继承于 Prism.DryIoc中的PrismApplication后 程序当中我们必须重写的两个抽象方法附上 PrismApplication 的父类中PrismApplicationBase 中的两个抽象方法 图1-1示例图(抽象方法必须由子类重写 抽象成员不具有方法体、只能在抽象方法中具有抽象成员等多种特性关于抽象的解释可用看我之前写的文章含抽象修饰词的解释)
图1-1内部方法截图
代码示例:
using Prism.DryIoc;
using Prism.Ioc;
using System.Windows;
using WpfApp5.ViewModel;
namespace WpfApp5
{
public partial class App : PrismApplication
{
protected override Window CreateShell()=> Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<MainWindow, MainWindowVM>();//指定MainWindow的DataContext 是MainWindowVM
containerRegistry.RegisterForNavigation<UserControl1>();//这种写法是没有指定
}
}
}
示例解释:
在重写的方法RegisterTypes中IContainerRegistry 类型参数 通过变量containerRegistry 的属性RegisterForNavigation注册窗体的同时指定窗体对应的VIewModel
使用ViewModelLocator 自动查找
代码示例:
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
示例解释:
在前端引用Prism位置给prism,prism:ViewModelLocator.AutoWireViewModel="True"是指定窗体时自动查找ViewModel,查找方式必须是 ViewModel文件夹中的:视图名称+ViewModel
自定义ViewModelLocator搜索方式
代码示例:
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Mvvm;
using System;
using System.Windows;
using WpfApp5.ViewModel;
namespace WpfApp5
{
public partial class App : PrismApplication
{
protected override Window CreateShell() => Container.Resolve<MainWindow>();
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<MainWindow,MainWindowVM>();
containerRegistry.RegisterForNavigation<UserControl1>();
}
protected override void ConfigureViewModelLocator()
{
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
var viewName = viewType.Name;
var viewModelNameSpace = $"WpfApp5.ViewModel";//名称控件位置
var viewModelName = $"{viewModelNameSpace}.{viewName}VM";//ViewModel的位置 全名称空间
//如不是同一个项目文件中,ViewModel是被分开在另一个项目文件中 那么需要将读取ViewModel项目文件下的dll
//var assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), "Paramecium.App.ViewModels.dll"));
Type type = Type.GetType(viewModelName);
return type;
});
}
}
}
示例解释:
我们需要关注到的是类中重写的方法 ConfigureViewModelLocator 其中是通过改变它的查找方式来改变默认的查找方式。由原来的ViewModel文件夹中的:视图名称+ViewModel,改为视图名称+VM(原来查找的位置是在VIewModel下查找)
指定控件容器的DataContext
写法1
<Window x:Class="WpfApp5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp5"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.DataContext>
<UserControl/>
<!--指定Grid中的上下文是UserControl数据上下文-->
</Grid.DataContext>
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Button Click="button_Click" Grid.Row="0"/>
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" />
</Grid>
</Window>
写法2
<Window x:Class="WpfApp5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp5"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
Title="MainWindow" Height="450" Width="800">
<Grid DataContext="{Binding User}">
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Button Click="button_Click" Grid.Row="0"/>
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" />
</Grid>
</Window>
namespace WpfApp5.ViewModel
{
public class MainWindowVM
{
public UserControl1VM User { get; set; } = new UserControl1VM();
}
}
指定控件的ViewModel
<Window
x:Class="WpfApp5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp5"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
Title="MainWindow"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Button
Grid.Row="0"
Click="button_Click"
DataContext="{Binding User}" />
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" />
</Grid>
</Window>