Prism 七区域上下文关联

还是从头开始来。

1、区域上下文。

1.1、通过NuGet添加Prism.DryIoc。如下图。

1.2、新建WPF项目WpfApp1,创建Views和ViewModels文件夹,将MainWindow.xaml文件移动到

Views文件下,在ViewModels文件夹下添加MainWindowViewModel.cs文件。

1.2.1、MainWindow.xaml代码如下。

<Window x:Class="WpfApp1.Views.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:WpfApp1"xmlns:prism="http://prismlibrary.com/"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><ContentControl prism:RegionManager.RegionName="ContentRegion" /></Grid>
</Window>

1.2.2、 MainWindowViewModel.cs代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WpfApp1.ViewModels
{public class MainWindowViewModel:BindableBase{private string _title="属性绑定";public string Title{get { return _title; }set { SetProperty(ref _title, value); }}}
}

1.3、修改App.xaml代码如下。

<prism:PrismApplication x:Class="WpfApp1.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp1"xmlns:prism="http://prismlibrary.com/"><Application.Resources></Application.Resources>
</prism:PrismApplication>

1.4、 修改App.xaml.cs代码如下。

using System.Configuration;
using System.Data;
using System.Windows;
using WpfApp1.ViewModels;
using WpfApp1.Views;namespace WpfApp1
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{protected override void RegisterTypes(IContainerRegistry containerRegistry){}protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void ConfigureViewModelLocator(){base.ConfigureViewModelLocator();ViewModelLocationProvider.Register<MainWindow,MainWindowViewModel>();}protected override IModuleCatalog CreateModuleCatalog(){//表示WpfApp1.exe程序所在目录下的Modules文件return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };}}}

1.5、新建WPF类库项目 WpfModule,新建文件夹Business添加Person.cs类,Person.cs代码如下。同样通过NuGet添加Prism.DryIoc。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;namespace WpfModule.Business
{public class Person : INotifyPropertyChanged{#region INotifyPropertyChangedpublic event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string propertyname = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));}#endregion //INotifyPropertyChangedprivate string _firstName;public string FirstName{get { return _firstName; }set{_firstName = value;OnPropertyChanged();}}private string _lastName;public string LastName{get { return _lastName; }set{_lastName = value;OnPropertyChanged();}}   private int _age;public int Age{   get { return _age; }set{_age = value;OnPropertyChanged();}}private DateTime? _lastUpdated;public DateTime? LastUpdated{get { return _lastUpdated; }set{_lastUpdated = value;OnPropertyChanged();}}public override string ToString(){return $"{FirstName} {LastName} is {Age} years old";}}
}

1.6、新建文件夹ViewModels,添加类PersonDetailViewModel.cs和PersonListViewModel.cs,PersonDetailViewModel.cs代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfModule.Business;namespace WpfModule.ViewModels
{public class PersonDetailViewModel : BindableBase{private Person _selectedPerson;public Person SelectedPerson{get { return _selectedPerson; }set { SetProperty(ref _selectedPerson, value); }}public PersonDetailViewModel(){}}
}

PersonListViewModel.cs代码如下。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfModule.Business;namespace WpfModule.ViewModels
{public class PersonListViewModel:BindableBase{private ObservableCollection<Person> _people;public ObservableCollection<Person> People{get { return _people; }set { SetProperty(ref _people, value); }}public PersonListViewModel(){CreatePeople();}private void CreatePeople(){var people = new ObservableCollection<Person>();for (int i = 0; i < 10; i++){people.Add(new Person(){FirstName = String.Format("First {0}", i),LastName = String.Format("Last {0}", i),Age = i});}People = people;}}
}

1.7、新建文件夹Views,添加用户控件PersonDetail.xaml和PersonList.xaml。

PersonDetail.xaml代码如下。

<UserControl x:Class="WpfModule.Views.PersonDetail"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfModule.Views"xmlns:prism="http://prismlibrary.com/"  prism:ViewModelLocator.AutoWireViewModel="True" ><Grid x:Name="LayoutRoot" Background="White"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><!-- First Name --><TextBlock Text="First Name:" Margin="5" /><TextBlock Grid.Column="1" Margin="5" Text="{Binding SelectedPerson.FirstName}" /><!-- Last Name --><TextBlock Grid.Row="1" Text="Last Name:" Margin="5" /><TextBlock Grid.Row="1" Grid.Column="1"  Margin="5" Text="{Binding SelectedPerson.LastName}" /><!-- Age --><TextBlock Grid.Row="2" Text="Age:" Margin="5"/><TextBlock Grid.Row="2" Grid.Column="1"  Margin="5" Text="{Binding SelectedPerson.Age}"/></Grid>
</UserControl>

PersonDetail.xaml.cs代码如下。

using Prism.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfModule.Business;
using WpfModule.ViewModels;namespace WpfModule.Views
{/// <summary>/// PersonDetail.xaml 的交互逻辑/// </summary>public partial class PersonDetail : UserControl{public PersonDetail(){InitializeComponent();RegionContext.GetObservableContext(this).PropertyChanged += PersonDetail_PropertyChanged;}private void PersonDetail_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e){var context = (ObservableObject<object>)sender;var selectedPerson = (Person)context.Value;(DataContext as PersonDetailViewModel).SelectedPerson = selectedPerson;}}
}

PersonList.xaml代码如下。

<UserControl x:Class="WpfModule.Views.PersonList"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfModule.Views"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True" ><Grid x:Name="LayoutRoot" Background="White" Margin="10"><Grid.RowDefinitions><RowDefinition Height="100"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><ListBox x:Name="_listOfPeople" ItemsSource="{Binding People}"/><ContentControl Grid.Row="1" Margin="10"prism:RegionManager.RegionName="PersonDetailsRegion"prism:RegionManager.RegionContext="{Binding SelectedItem, ElementName=_listOfPeople}"/></Grid>
</UserControl>

PersonList.xaml.cs代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WpfModule.Views
{/// <summary>/// PersonList.xaml 的交互逻辑/// </summary>public partial class PersonList : UserControl{public PersonList(){InitializeComponent();}}
}

1.8、新添加类WpfModuleA.cs,代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfModule.Views;namespace WpfModule
{public class WpfModuleA : IModule{public void OnInitialized(IContainerProvider containerProvider){var regionManager = containerProvider.Resolve<IRegionManager>();regionManager.RegisterViewWithRegion("ContentRegion", typeof(PersonList));regionManager.RegisterViewWithRegion("PersonDetailsRegion", typeof(PersonDetail));}public void RegisterTypes(IContainerRegistry containerRegistry){}}
}

1.9、个人理解,

regionManager.RegisterViewWithRegion("ContentRegion", typeof(PersonList));

将PersonList.xaml这个界面注册到MainWindow.xaml中的ContentRegion区域。

regionManager.RegisterViewWithRegion("PersonDetailsRegion", typeof(PersonDetail));

将PersonDetail.xaml这个界面注册到PersonList.xaml界面中的PersonDetailsRegion区域。

        <ListBox x:Name="_listOfPeople" ItemsSource="{Binding People}"/>

将ListBox的数据源与People绑定。

        <ContentControl Grid.Row="1" Margin="10"prism:RegionManager.RegionName="PersonDetailsRegion"prism:RegionManager.RegionContext="{Binding SelectedItem, ElementName=_listOfPeople}"/>

区域PersonDetailsRegion已与PersonDetail.xaml界面绑定,区域的上下文也就是prism:RegionManager.RegionContext,与控件listOfPeople(ListBox)的SelectedItem进行绑定。

在PersonDetail.xaml.cs中绑定了区域上下午属性变更方法,如下。

RegionContext.GetObservableContext(this).PropertyChanged += PersonDetail_PropertyChanged;

属性变更后执行的函数如下。

        private void PersonDetail_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e){var context = (ObservableObject<object>)sender;var selectedPerson = (Person)context.Value;(DataContext as PersonDetailViewModel).SelectedPerson = selectedPerson;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1288.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

UOS 安装usb wifi 网卡驱动

电脑上装安uos后发现usb网卡驱动不见了&#xff0c;网卡长下面这个样子&#xff0c;但是官方没有驱动 驱动网址选5300 https://www.ezcast.com/app/ezcast/wifi-adapter/windows 这时我们 lsusb找到相关设备&#xff0c;发现是Realtek 的设备 要在 Ubuntu 上安装 Realtek 0bda…

开放式耳机什么品牌质量好?5款排行榜里的开放式蓝牙耳机

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

二:Linux学习笔记(第一阶段)-- Linux命令

目录 Linux注意事项&#xff1a; Linux目录 Linux系统基础命令 1. 文件和目录操作 2. 文件查看和编辑 3. 文件权限和所有权 4. 系统信息 5. 网络命令 6. 文件查找 7. 压缩和解压缩 8. 系统管理 Linux注意事项&#xff1a; 严格区分大小写一切皆文件windows下的程序不…

【网络】Wireshark工具介绍和下载地址

https://www.wireshark.org/ 下载地址 介绍地址 Wireshark is a network protocol analyser. It can be used to capture packets from a network connection. Wireshark是一个网络协议分析器。它可以用来捕获来自网络连接的数据包。 1.1. What is Wireshark? Wireshark is…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

STM32的TIM中Prescaler和ClockDivision有什么用以及计数器溢出时间计算

我们在stm32中需要使用到时钟&#xff0c;在设置时容易把Prescaler和ClockDivision混淆&#xff0c;为什么有时候ClockDivision不需要设置呢&#xff1f;一下是解释&#xff1a; 1. Prescaler&#xff08;预分频器&#xff09; 功能&#xff1a;Prescaler 的作用是降低定时器的…

A011-基于SpringBoot的视频点播系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装视频点播系统软件来发挥其高效地信息处理的作用&#xff0c…

高阶数据结构--图(graph)

图&#xff08;graph&#xff09; 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…

MySQL FIND_IN_SET 函数详解

文章目录 1. 基本语法2. 使用场景3. 实战示例3.1 基础查询示例3.2 与其他函数结合使用3.3 动态条件查询 4. 性能考虑5. 常见问题和解决方案5.1 大小写敏感问题5.2 空值处理5.3 模糊匹配 6. 总结 1. 基本语法 FIND_IN_SET 函数的基本语法如下&#xff1a; FIND_IN_SET(str, st…

AI产品经理全攻略:策略制定、开发过程与商业化路径【AI产品经理必读书籍】

通过《AI产品经理手册》&#xff0c;将可以了解不同类型的AI&#xff0c;如何将AI整合到产品或业务中&#xff0c;以及支持创建AI产品或将AI集成到现有产品所需的基础设施。熟悉实践管理AI产品开发流程、评估和优化AI模型&#xff0c;以及应对与AI产品相关的复杂伦理和法律问题…

Unity3D UI 拖拽

Unity3D 实现 UI 元素拖拽功能。 UI 拖拽 通常画布上的 UI 元素都是固定位置的&#xff0c;我们可以通过实现拖拽接口&#xff0c;让 UI 元素可以被拖拽到其他位置。 拖拽接口 创建一个脚本 UIDrag.cs&#xff0c;在默认继承的 MonoBehaviour 后面&#xff0c;再继承三个接…

RHCE: DNS服务器

一.DNS简介及其相关 提供DNS服务的软件叫bind&#xff0c;服务名是named。 1) DNS简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 post: 53 …

Linux脚本(if、else、case、test中括号)

文章目录 if else 值比较if 逻辑测试if testif [] 与[[]]if字符串比较校验if文件校验case基本结构case字符串case或(|)case通配符case 通配符组合使用 if else 值比较 注意:if []中两边有空格&#xff0c;if和中括号之间也有空格&#xff0c;变量两边无空格 比较符号说明-eq等…

WPF+MVVM案例实战(十六)- 实现一个下拉式菜单(下)

文章目录 1、案例效果2、二级有子项菜单样式实现3、样式整理汇整4、菜单事件触发5、源代码下载1、案例效果 2、二级有子项菜单样式实现 分析菜单面板如下所示: 他其实和一级菜单有子项类似,只是指示箭头和弹出面板的位置不一样,一级菜单是底部弹出,二级菜单是右侧弹出。理…

C#二分查找算法

前言 二分查找算法是一种在有序数组中查找特定元素的搜索算法。 实现原理 二分查找的实现依赖于以下几个关键步骤&#xff1a; 计算查找范围的中间索引。 比较中间索引处的值与目标值。 根据比较结果调整查找范围&#xff08;左半部分或右半部分&#xff09;。 重复上述步…

WPF+MVVM案例实战(十五)- 实现一个下拉式菜单(上)

文章目录 1 案例效果2、图标资源下载3、功能实现1.文件创建2、菜单原理分析3、一级菜单两种样式实现1、一级菜单无子项样式实现2、一级菜单有子项样式实现 4、总结 1 案例效果 提示 2、图标资源下载 从阿里矢量素材官网下载需要的菜单图片&#xff0c;如下所示&#xff1a; …

2024快手面试算法题-生气传染

问题描述 思路分析 生气只会向后传播&#xff0c;最后一个生气的人一定是最长连续没有生气的人中的最后一个人&#xff0c;前提是前面得有一个人生气。 注意&#xff0c;一次只能传播一个人&#xff0c;比如示例1&#xff0c;第一次只会传播给第一个P&#xff0c;不会传播给第…

powerlaw:用于分析幂律分布的Python库

引言 幂律分布在游戏行业中非常重要。在免费游戏模式下&#xff0c;玩家的付费行为往往遵循幂律分布。少数“鲸鱼玩家”贡献了大部分的收入&#xff0c;而大多数玩家可能只进行少量或不进行付费。通过理解和应用幂律分布&#xff0c;游戏开发者可以更好地分析和预测玩家行为&a…

Pr 视频效果:透视

效果面板/视频效果/透视 Video Effects/Perspective Adobe Premiere Pro 的视频效果中&#xff0c;透视 Perspective效果组主要用于在二维平面的视频剪辑中模拟三维空间的透视效果。 通过调整这些效果&#xff0c;可以改变图像的视角、添加阴影、创造立体感&#xff0c;增强画面…

使用 Python 中的 pydub实现 M4A 转 MP3 转换器

在现代数字生活中&#xff0c;我们常常需要处理不同格式的音频文件。今天&#xff0c;我将与大家分享一个简单的 Python 项目&#xff0c;它使用 wxPython 创建一个图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;能够将 .m4a 文件转换为 .mp3 文件。这个项目还将…