近期公司重构了些界面,因为换肤和界面定制的缘故,需要把样式和逻辑分开;所以记录下关键的操作;主要是利用命令代替事件,利用命令传递事件的参数...

先大致看下效果:

主要是利用 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的更多相关文章

  1. 前后端分离开发,基于SpringMVC符合Restful API风格Maven项目实战(附完整Demo)!

    摘要: 本人在前辈<从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)>一文的基础上,实现了一个基于Spring的符合REST风格的完整Demo,具有MVC分层结构并 ...

  2. REST风格框架实战:从MVC到前后端分离(附完整Demo)

    既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...

  3. 【转】REST风格框架实战:从MVC到前后端分离(附完整Demo)

    版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/justloveyou_/ ...

  4. Shell入门教程:命令替换 $() 和 ``

    所谓命令替换,是把命令执行后的标准输出放入变量中.这是一个十分有威力的功能.例如说, 想查看工作目录中所有的文件名,可执行ls命令,但如何把这些文件名存入变量中,供往后的程序代码再利用呢? 使用命令替 ...

  5. 3shell命令替换

    Shell 命令替换是指将命令的输出结果赋值给某个变量.比如,将使用ls命令查看到的某个目录中的内容保存到某个变量中,这就需要使用命令替换. Shell 中有两种方式可以完成命令替换,一种是反引号` ...

  6. 一文聊透 Netty IO 事件的编排利器 pipeline | 详解所有 IO 事件的触发时机以及传播路径

    欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 1. 前文回顾 在前边的系列文章中,笔者为大家详细剖析了 Re ...

  7. linux-shell-引用-命令替换-命令退出状态-逻辑操作符

    命令替换:bash7步扩展的之一 嵌套  这里没什么意义 退出状态可以参与逻辑判断 表达式 算数表达式和条件表达式,逻辑表达式 查看passwd命令比,避免用户捕获输入密码的接口 这种方式就可以直接输 ...

  8. tkinter的GUI设计:界面与逻辑分离(二)-- 菜单栏

    由于要用到文件对话框和消息对话框,所以先给出下面的列表. py2 与 py3 中 tkinter 的变化: Tkinter → tkinter tkMessageBox → tkinter.messa ...

  9. Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出

    SHELL 编程     shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell)     shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. ...

  10. 关于linux vi命令替换的使用说明

    转自:http://os.51cto.com/art/200907/140987.htm vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法( ...

随机推荐

  1. dart箭头函数和自执行函数的详解

    01==>箭头函数 // List list = ['苹果', '香蕉', '栗子']; // list.forEach((element) { // print(element); // }) ...

  2. dart中所有的循环详解

    List MyList = ['苹果', '栗子', '小苹果']; for (var i = 0; i < MyList.length; i++) { print(MyList[i]); } ...

  3. DevExpress MVVM Framework. Interaction of ViewModels. Messenger

    学习记录: 学习地址:https://community.devexpress.com/blogs/wpf/archive/2013/12/13/devexpress-mvvm-framework-i ...

  4. 开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

    总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能.可连接16个扩展板,具有PWM输出.过流过热 ...

  5. 聊聊 FocusSearch/focus_mcp_sql:Text2SQL 的新玩法

    最近在 GitHub 上逛的时候,发现了一个挺有意思的项目--FocusSearch/focus_mcp_sql.作为一个对 Text2SQL 有点小研究的前端码农,我忍不住想和大家聊聊这个工具.它不 ...

  6. RNN、lstm和GRU推导

    RNN:(Recurrent Neural Networks)循环神经网络 第t层神经元的输入,除了其自身的输入xt,还包括上一层神经元的隐含层输出st−1 每一层的参数U,W,V都是共享的 lstm ...

  7. Ubuntu 部署饥荒联机版服务器 Linux DST_Dedicate_Server

    0. 文件夹 - ~ |- ~/steamcmd # 装的是steamcmd_linux.tar.gz以及其解压出来的东西 |- ~/DST # 装的是DST服务器可执行文件.世界存档.世界模板 |- ...

  8. WPF .Net Core 3.1遇到Satellite Assemblies无法正常加载的处理

    1.原因 加载的时候没有调取 AssemblyLoadContext.Default 2.解决方案: 在程序启动的时候,手动调用 /// <summary> /// Interaction ...

  9. autMan奥特曼机器人-跳过注册页面直接进入登陆页面

    1.将下面4行内容存成txt文件[注意将"账号"和"密码"等字眼替换为自己的真正账号和密码],文件名改成sets.conf,放到autman主文件夹,见下图最下 ...

  10. Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录

    Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录 比赛连接 手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到 \(10 ...