WPF MVVM框架 Caliburn.Micro的Action绑定

WPF MVVM框架 Caliburn.Micro的Action绑定

  1. 通过命名约定来绑定Action
    View
<Window x:Class="WpfApp1.Views.AboutView"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"mc:Ignorable="d" WindowStartupLocation="CenterScreen" SizeToContent="WidthAndHeight"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:cal="http://www.caliburnproject.org"xmlns:conv="clr-namespace:WpfApp1.Converters"Title="About"  MinHeight="800" MinWidth="800" WindowStyle="SingleBorderWindow"><Grid><Button Name="OK" Width="100" Height="80" Content="Click"/></Grid>
</Window>

ViewModel


using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using Caliburn.Micro;
using WpfApp1.Models;namespace WpfApp1.ViewModels
{public class AboutViewModel{public void Ok(){MessageBox.Show("Test");}}
}

点击View中的按钮时,可以把Clicked事件的处理函数导航到ViewModel中的OK方法中,其原因是命名规则遵守了Caliburn.Micro的约定,即View中的Button名称叫OK,ViewModel中有一个OK的方法。

  1. 通过Message.Attach来设置Event Handler
    View
<Window x:Class="WpfApp1.Views.AboutView"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"mc:Ignorable="d" WindowStartupLocation="CenterScreen" SizeToContent="WidthAndHeight"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:cal="http://www.caliburnproject.org"xmlns:conv="clr-namespace:WpfApp1.Converters"Title="About"  MinHeight="800" MinWidth="800" WindowStyle="SingleBorderWindow"><Grid><Button cal:Message.Attach="OK" Width="100" Height="80" Content="Click"/></Grid>
</Window>

ViewModel部分同上
就其原因是Caliburn.Micro内部有维护一个消息触发器,xaml中的写法相当于注册到了消息中心,当用户点击按钮时,消息中心会匹配到对应的ViewModel中同名的函数作为Handler

下面用一个完整的Demo展示,如何绑定到更复杂的事件、如何传参数
View

<Window x:Class="WpfApp1.Views.AboutView"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"mc:Ignorable="d" WindowStartupLocation="CenterScreen" SizeToContent="WidthAndHeight"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:cal="http://www.caliburnproject.org"xmlns:conv="clr-namespace:WpfApp1.Converters"Title="About"  MinHeight="800" MinWidth="800" WindowStyle="SingleBorderWindow"><Window.Resources><conv:Color2SolidBrushConverter x:Key="colorConverter"/><DataTemplate x:Key="combItem" DataType="{x:Type ComboBoxItem}"><StackPanel Orientation="Horizontal" Width="100"  Height="20"><Rectangle Width="20" Height="20" Fill="{Binding Color,Converter={StaticResource colorConverter}}"/><TextBlock Text="{Binding Name}" Margin="5,0,0,0"/></StackPanel></DataTemplate></Window.Resources><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="200"/><ColumnDefinition Width="600"/></Grid.ColumnDefinitions><Grid Grid.Column="0"><ComboBox Name="cmb" ItemsSource="{Binding Colors}" SelectedItem="{Binding SelectedColor}" Width="100" Height="28" ItemTemplate="{StaticResource combItem}"cal:Message.Attach="[Event SelectionChanged] = [Action OnSelectedColorChanged($eventArgs)]"/></Grid><Grid Grid.Column="1"><Rectangle Fill="{Binding SelectedColor.Color,Converter={StaticResource colorConverter}}"/></Grid></Grid>
</Window>

ViewModel

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.using System.Collections.ObjectModel;
using System.Windows.Controls;
using Caliburn.Micro;
using WpfApp1.Models;namespace WpfApp1.ViewModels
{public class AboutViewModel:Screen{private ColorModel _selectedColor;public ObservableCollection<ColorModel> Colors { get; set; }public ColorModel SelectedColor{get => _selectedColor;set{_selectedColor = value;NotifyOfPropertyChange(nameof(SelectedColor));}}public void OnSelectedColorChanged(SelectionChangedEventArgs e){ }public AboutViewModel(){Colors=new ObservableCollection<ColorModel>();Colors.Add(new ColorModel("Red","Red"));Colors.Add(new ColorModel("Green","Green"));Colors.Add(new ColorModel("Blue","Blue"));Colors.Add(new ColorModel("White","White"));}}
}

Model

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.using Caliburn.Micro;namespace WpfApp1.Models
{public class ColorModel : Screen{private string _color;private string _name;public ColorModel(string color, string name){_color = color;_name = name;}public string Color{get => _color;set{if (!string.IsNullOrEmpty(value)){_color = value;NotifyOfPropertyChange(nameof(Color));}}}public string Name{get => _name;set{if (!string.IsNullOrEmpty(_name)){_name = value;NotifyOfPropertyChange(nameof(Name));}}}}
}

Converter

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;namespace WpfApp1.Converters
{public class Color2SolidBrushConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value != null){if (value.ToString() == "Red"){return new SolidColorBrush(Colors.Red);}else if(value.ToString() == "Green"){return new SolidColorBrush(Colors.Green);}else if (value.ToString() == "Blue"){return new SolidColorBrush(Colors.Blue);}else{return new SolidColorBrush(Colors.Black);}}return default;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){return default;}}
}

效果:
左边的Combobox变化时,把对应的颜色填充到右边的Rectangle中
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 基础特性

Spring Boot 特性&#xff1a; SpringBoot Starter&#xff08;场景启动器&#xff09;&#xff1a;将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。使编码变得简单&#xff0c;SpringBoot采用 Ja…

Meta的元宇宙愿景:技术战略与AI的融合未来

Meta作为科技界的领军企业&#xff0c;其在元宇宙领域的战略布局和未来展望一直是行业关注的焦点。Meta的CTO Andrew Bosworth&#xff08;博斯沃思&#xff09;最近详细阐述了公司的元宇宙战略、XR眼镜的市场突破以及AI时代的发展蓝图。 一、元宇宙战略&#xff1a;定义三个时…

Django 删除所有数据

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFiel…

【java深入学习第5章】Spring Boot 统一功能的实现及处理方式

Spring Boot 统一功能处理 在开发 Web 应用程序时&#xff0c;为了提高代码的可维护性和可扩展性&#xff0c;我们通常会采用一些统一的功能处理方式。本文将介绍如何在 Spring Boot 中实现统一的数据返回格式、异常处理和功能处理&#xff0c;并通过一个图书管理系统的案例来…

论文翻译:Rethinking Interpretability in the Era of Large Language Models

https://arxiv.org/abs/2402.01761 在大型语言模型时代的可解释性再思考 摘要 在过去十年中&#xff0c;随着越来越大的数据集和深度神经网络的兴起&#xff0c;可解释机器学习领域的兴趣迅速增长。同时&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在广泛的任务中…

k8s之client-go:golang与k8s交互的桥梁

文章目录 前言示例总结 前言 k8s是一个非常成熟且强大的容器自动化编排引擎&#xff0c;对于这样一个利器&#xff0c;k8s官方提供了clientgo用来给我们使用golang去接入k8s&#xff0c;通过k8s的api来对k8s中的资源进行操作 通过client-go实现对k8s集群中资源对象(包括deploy…

TypeScript 基础类型(一)

简介 它是 JavaScript 的超集&#xff0c;具有静态类型检查和面向对象编程的特性。TypeScript 的出现&#xff0c;为开发者提供了一种更加严谨和高效的开发方式。 主要特点&#xff1a; 、静态类型检查。 通过静态类型检查&#xff0c;开发者可以在编译时发现错误&#xff0…

QQ频道导航退出

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140413538 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Jquery常用操作汇总,dom操作,ajax请求

这段时间在写一些小Demo&#xff0c;用的都是很远古的Jquery,哈哈哈&#xff0c;但是呢也挺好玩儿的。想着记录一下。 题外话&#xff1a;补充一些自己欠缺的前端知识&#xff0c;&#xff08;我的前端学的比较乱&#xff0c;哈哈哈&#xff0c;原生的js不是很熟&#xff0c;&a…

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构 一.链表的中间节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 二.返回倒数第k个节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 三.反转链表思路1&#xff1a;头插法思路2&#xff1a;反转指针的指向 四.链表的回文结构思路1&#xff1a;利…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符&#xff08;三元运算符&#xff09;7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…

Laravel入门:快速启动你的第一个应用

当然&#xff01;下面是关于如何使用Laravel快速启动你的第一个应用的教程。 Laravel入门&#xff1a;快速启动你的第一个应用 1. 简介 Laravel是一个现代化的PHP框架&#xff0c;以其优雅的语法和丰富的功能广受欢迎。本教程将引导你从零开始创建一个简单的Laravel应用。 2…

python的自省机制(改bug有用)

在 Python 中&#xff0c;自省&#xff08;Introspection&#xff09;机制是指程序在运行时能够获取自身的信息&#xff0c;例如对象的类型、属性、方法等。 Python 提供了一些内置函数和特殊属性来支持自省。以下是一些常见的例子&#xff1a; type() 函数&#xff1a;返回对象…

Prometheus 云原生 - 监控 Linux、MySQL、Redis、RabbitMQ、Docker、SpringBoot 3.x

目录 开始 Exporter 采集数据&#xff0c;Prometheus 拉取并监控 Linux MySQL Redis RabbitMQ Docker SpringBoot 3.x 开始 Exporter 采集数据&#xff0c;Prometheus 拉取并监控 Note&#xff1a;Prometheus 和 Grafana 的部署已经在前面的章节中讲过了&#xff0c;不…

Solana Blink和SEND的崛起:技术与市场效应的结合

随着Solana生态系统的不断发展&#xff0c;新的项目和技术不断涌现&#xff0c;吸引了大量的关注和投资。最近&#xff0c;Solana的Blink项目及其相关的SEND代币成为了市场的焦点&#xff0c;引发了广泛的讨论和投资热潮。本文将探讨Blink和SEND的技术创新、市场表现以及未来的…

C++中的自定义数据类型:类和结构体

目录 自定义数据类型(1)类A.面向对象的四大特征B.What&#xff08;什么是类&#xff09;C.Why&#xff08;类的作用&#xff09;D.How&#xff08;如何定义和使用类&#xff09; (2)结构体 自定义数据类型 (1)类 A.面向对象的四大特征 谈到类&#xff0c;就必须讲一下面向对…

基于MATHCAD的傅里叶级数模拟和方波图像绘制

一、MATHCAD软件简介 MATHCAD是一款功能强大的数学计算软件&#xff0c;它允许用户以类似手写公式的方式输入数学表达式&#xff0c;并即时显示计算结果和图形。在工程研究和学术写作的世界里&#xff0c;MathCAD以其强大的符号运算能力和直观的数学书写体验脱颖而出。MATHCAD…

三相PWM整流器PI双闭环控制Simulink

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Rb&#xff09;软件。建议采用matlab2017 Rb及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.拓扑结构&#xff1a; 3.模型算法架构&#xff1a; 4.仿真算法&#xff1a; &am…

Lua协程(同步的多线程)

1.coroutine.create( func ) 创建一个协程&#xff0c;返回co&#xff08;coroutine&#xff09;&#xff0c;参数是一个函数&#xff0c;当调用resume时就唤醒co并调用函数 2.coroutine.resume(co, 函数参数们) 启动协程co并传入协程调用函数的参数&#xff0c;可以带回协程…

前端XMLHttpRequest、Fetch API、Axios实现文件上传、下载方法及后端Spring文件服务器处理方法

前言 本文总结Web应用开发中文件上传、下载的方法&#xff0c;即从前端表单输入文件并封装表单数据&#xff0c;然后请求后端服务器的处理过程&#xff1b;从基础的JavaScript中XmlHttpRequest对象、Fetch API实现上传、下载进行说明&#xff0c;并给出了前端常用的axios库的请…