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 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法( ...
随机推荐
- h5移动端像素适配 postcss-pxtorem和amfe-flexible
Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具: postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem; amfe-flexib ...
- 帮您了解CDN节点如何做到访问加速与安全防护
本文分享自天翼云开发者社区<帮您了解CDN节点如何做到访问加速与安全防护>,作者:尹****荷 网站业务痛点 在当前网站快速发展的背景下,网站业务突增往往伴随着一系列网络安全隐患.主要会有 ...
- 深入掌握 SQL 深度应用:复杂查询的艺术与技巧
title: 深入掌握 SQL 深度应用:复杂查询的艺术与技巧 date: 2025/2/10 updated: 2025/2/10 author: cmdragon excerpt: SQL(结构化 ...
- flutter-构造方法给数组list默认空值
1 class NewstStyle extends StatelessWidget { 2 final List<DkCenterUpload> upload; 3 const News ...
- ABB工业机器人控制柜IRC5维修具体细节
对于ABB机器人维修工作,需要具备专业的知识和技能,同时遵循维修步骤和注意事项.通过加强预防措施和建议的实施,可以有效降低ABB工业机器人控制柜IRC5的故障率,提高ABB工业机器人的整体运行效率. ...
- C51二进制数输入宏
在C语言中有十进制,十六进制,八进制;没有二进制的定义,在C51中使用十六进制表示有时不太直观,下面介绍几种方法表示二进制[均来自网络] 方法一 #define _BIN(a,b,c,d,e,f,g, ...
- 【COM3D2Mod 制作教程(6)】实战!制作身体部分(下)
[COM3D2Mod 制作教程(6)]实战!制作身体部分(下) 有了上一章制作帽子的经验,此时做头发很多就不必再重复赘述了,但如果用完全一样的流程和方法,把头发做好后直接装扮就会导致游戏报错,这就是我 ...
- vscode launch program "xxx" does not exist
Error Solution Please Click The Build Button Other This maybe is the one of Makefile Tools or 'c++ e ...
- 傻妞教程——对接PagerMaid-Pyro
PagerMaid-Pyro 是一个开源的 TG 人形自走 Bot 方案,功能强大而丰富,可以帮助你打造专属的便利功能. 为什么叫人形机器人? TG 官方是有 Bot Api 的,但是这个 Api 需 ...
- Redis集群(cluster模式)搭建(三主三从)
上一篇搭建了一主二从,并加入了哨兵,任何一个节点挂掉都不影响正常使用,实现了高可用.仍然存在一个问题,一主二从每个节点都存储着全部数据,随着业务庞大,数据量会超过节点容量,即便是redis可以配置清理 ...