Prism 框架 -含ViewModelLocator

本文详细介绍了在Prism框架中如何指定视图(View)的绑定上下文(ViewModel),包括通过注册视图时指定命名空间、使用ViewModelLocator自动查找以及自定义ViewModelLocator搜索方式。此外,还展示了如何直接指定控件容器的数据上下文和控件的ViewModel。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要做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>();//这种写法是没有指定
        }
    }
}

示例解释:

     在重写的方法RegisterTypesIContainerRegistry  类型参数 通过变量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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学软件开发的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值