MVVM_UI和逻辑分离(事件利用命令替换),命令代替事件,命令传递事件参数,附完整demo
近期公司重构了些界面,因为换肤和界面定制的缘故,需要把样式和逻辑分开;所以记录下关键的操作;主要是利用命令代替事件,利用命令传递事件的参数...
先大致看下效果:
主要是利用 Prism 库,可直接利用 nuget 添加
下面是详细代码:
1 <Window x:Class="Demo_MVVM.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:Demo_MVVM"
7 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
8 xmlns:prism="http://www.codeplex.com/prism"
9 mc:Ignorable="d"
10 Title="MainWindow"
11 WindowStartupLocation="CenterScreen"
12 Height="350"
13 Width="400"
14 DataContext="{DynamicResource vm}"
15 >
16 <Window.Resources>
17 <local:ReverseBool x:Key="ReverseBool" />
18
19 <DataTemplate x:Key="Template1">
20 <TextBlock Text="{Binding IsTemplate1,StringFormat=我是模板1:{0}}"/>
21 </DataTemplate>
22
23 <DataTemplate x:Key="Template2">
24 <TextBlock Text="{Binding IsTemplate1,StringFormat=我是模板2:{0}}"/>
25 </DataTemplate>
26
27 <local:MainWindowViewModel x:Key="vm"/>
28 </Window.Resources>
29 <Grid>
30 <StackPanel>
31 <TextBlock Text="采用mvvm,UI和逻辑分离" />
32 <StackPanel Orientation="Horizontal">
33 <RadioButton Content="模板1" IsChecked="{Binding IsTemplate1}" GroupName="mb" />
34 <RadioButton Content="模板2" IsChecked="{Binding IsTemplate1,Converter={StaticResource ReverseBool}}" GroupName="mb" />
35 </StackPanel>
36 <ContentControl Content="{Binding}">
37 <ContentControl.Style>
38 <Style TargetType="ContentControl">
39 <Setter Property="ContentTemplate" Value="{StaticResource Template1}" />
40 <Style.Triggers>
41 <DataTrigger Binding="{Binding IsTemplate1}" Value="false">
42 <Setter Property="ContentTemplate" Value="{StaticResource Template2}" />
43 </DataTrigger>
44 </Style.Triggers>
45 </Style>
46 </ContentControl.Style>
47 </ContentControl>
48
49 <TextBox Text="这里面实现了鼠标滚动获取滚动向量" Height="100" >
50 <i:Interaction.Triggers>
51 <i:EventTrigger EventName="PreviewMouseWheel">
52 <prism:InvokeCommandAction Command="{Binding MouseWheelCommand}"/>
53 </i:EventTrigger>
54 </i:Interaction.Triggers>
55 </TextBox>
56 </StackPanel>
57 <i:Interaction.Triggers>
58 <i:EventTrigger EventName="Loaded">
59 <prism:InvokeCommandAction Command="{Binding InitCommand}"/>
60 </i:EventTrigger>
61 </i:Interaction.Triggers>
62 </Grid>
63 </Window>
1 using Prism.Commands;
2 using System;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8 using System.Windows;
9 using System.Windows.Input;
10
11 namespace Demo_MVVM
12 {
13 class MainWindowViewModel : INotifyPropertyChanged
14 {
15 private bool isTemplate1 = true;
16
17 public event PropertyChangedEventHandler PropertyChanged;
18
19 public ICommand InitCommand { get; private set; }
20 public DelegateCommand<object> MouseWheelCommand { get; set; }
21
22 public bool IsTemplate1
23 {
24 get => isTemplate1;
25 set
26 {
27 isTemplate1 = value;
28 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsTemplate1)));
29 }
30 }
31
32
33 public MainWindowViewModel()
34 {
35 InitCommand = new DelegateCommand(Init);
36 MouseWheelCommand = new DelegateCommand<object>(MouseWheel);
37 }
38
39 void Init()
40 {
41 MessageBox.Show("初始化完成!");
42 }
43
44 void MouseWheel(object obj)
45 {
46 if (obj is MouseWheelEventArgs eventArgs)
47 {
48 MessageBox.Show("滚动了:" + eventArgs.Delta);
49 }
50 }
51 }
52 }
有需要完整demo的,包含所需要的库,请移步下载
MVVM_UI和逻辑分离(事件利用命令替换),命令代替事件,命令传递事件参数,附完整demo的更多相关文章
- 前后端分离开发,基于SpringMVC符合Restful API风格Maven项目实战(附完整Demo)!
摘要: 本人在前辈<从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)>一文的基础上,实现了一个基于Spring的符合REST风格的完整Demo,具有MVC分层结构并 ...
- REST风格框架实战:从MVC到前后端分离(附完整Demo)
既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...
- 【转】REST风格框架实战:从MVC到前后端分离(附完整Demo)
版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/justloveyou_/ ...
- Shell入门教程:命令替换 $() 和 ``
所谓命令替换,是把命令执行后的标准输出放入变量中.这是一个十分有威力的功能.例如说, 想查看工作目录中所有的文件名,可执行ls命令,但如何把这些文件名存入变量中,供往后的程序代码再利用呢? 使用命令替 ...
- 3shell命令替换
Shell 命令替换是指将命令的输出结果赋值给某个变量.比如,将使用ls命令查看到的某个目录中的内容保存到某个变量中,这就需要使用命令替换. Shell 中有两种方式可以完成命令替换,一种是反引号` ...
- 一文聊透 Netty IO 事件的编排利器 pipeline | 详解所有 IO 事件的触发时机以及传播路径
欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 1. 前文回顾 在前边的系列文章中,笔者为大家详细剖析了 Re ...
- linux-shell-引用-命令替换-命令退出状态-逻辑操作符
命令替换:bash7步扩展的之一 嵌套 这里没什么意义 退出状态可以参与逻辑判断 表达式 算数表达式和条件表达式,逻辑表达式 查看passwd命令比,避免用户捕获输入密码的接口 这种方式就可以直接输 ...
- tkinter的GUI设计:界面与逻辑分离(二)-- 菜单栏
由于要用到文件对话框和消息对话框,所以先给出下面的列表. py2 与 py3 中 tkinter 的变化: Tkinter → tkinter tkMessageBox → tkinter.messa ...
- Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出
SHELL 编程 shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell) shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. ...
- 关于linux vi命令替换的使用说明
转自:http://os.51cto.com/art/200907/140987.htm vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法( ...
随机推荐
- Oracle用户的创建和授权
1 --创建用户.密码 2 create user infouser identified by "User@2022!"; 3 --授权连接数据库权限 4 grant conne ...
- 手把手教你编写自定义Categraf插件
本文分享自天翼云开发者社区<手把手教你编写自定义Categraf插件>,作者:任****佳 Categraf 是一个监控采集 Agent,类似 Telegraf.Grafana-Agent ...
- Q:oracle通过正则表达式替换对应值
示例 把http://192.168.1.1:8888/a.html中的192.168.1.1:8888/替换成172.32.32.1:9999/ SELECT replace('http://192 ...
- mysql之数据连接池
数据库连接池 C3P0: 配置文件 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config&g ...
- JS中的0和php中的0
请注意:包含 0 的字符串 "0" 是 true 一些编程语言(比如 PHP)视 "0" 为 false.但在 JavaScript 中,非空的字符串总是 tr ...
- Laravel11 从0开发 Swoole-Reverb 扩展包(四) - 触发一个广播事件到reverb服务之后是如何转发给前端订阅的呢(下)?
前情提要 上一篇我们讲到了reverb服务的通信上下文和路由处理,路由实现了pusher关联的几种请求.那么这一篇我们主要来讲混响服务Server 混响 Server 负责基于 ReactPHP 的 ...
- Ubuntu如何下载nvidia驱动和Cuda Toolkit
Ubuntu如何下载nvidia驱动和Cuda Toolkit 前言 手快不小心把 nvidia 的某个东西删除了,现在不得不全部卸载后再重新安装了. 我再也不敢在不确认内容的情况下,确认删除了 ...
- helm Error: INSTALLATION FAILED: cannot re-use a name that is still in use
前言 使用helm安装服务报错,修改chat后重新安装报错:安装失败:无法重复使用仍在使用的名称 解决方法 1.查找安装失败的服务 helm -n {namespace} ls -a 2.删除安装失败 ...
- SpringBoot把本地的对象封装成为Nacos的配置对象
你需要有个Nacos Nacos建立你的配置文件--建议yml文件 编写你的yml配置 platform: transaction: properties: notifyHost: "htt ...
- SQL INSERT批量插入方式
1.常规INSERT写法 INSERT INTO ... VALUES (...); INSERT INTO 表名( `字段1`, `字段2`) VALUES ('字段1的值', '字段2的值') ...