Prism 框架 -含ViewModelLocator
本文主要做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?
<Windowx: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><ButtonGrid.Row="0"Click="button_Click"DataContext="{Binding User}" /><ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" /></Grid> </Window>總結
以上是生活随笔為你收集整理的Prism 框架 -含ViewModelLocator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将照片变成黑白照?
- 下一篇: 【SpringMVC笔记05】Sprin