首页 > 其他分享 >MVVMLight的简单使用

MVVMLight的简单使用

时间:2024-01-16 17:55:22浏览次数:27  
标签:订阅 object string MVVMLight void 使用 Show 简单 public

1.MVVM模式

前台:

<StackPanel>
    <TextBox Margin="10" Height="20" Background="LightCyan" x:Name="text1"/>
    <TextBox Margin="10,0" Height="20" Background="LightCyan" Text="{Binding Title}"/>
    <Button Content="Button" Margin="10"  Command="{Binding AddCommand}" CommandParameter="{Binding ElementName=text1,Path=Text}"/>
</StackPanel>

后台:

class MainWindowViewModel:ViewModelBase
{
    private string title;
    public string Title
    {
        get { return title; }
        set{
            title = value;
            this.RaisePropertyChanged();
        }
    }
    
    //带参数
    public RelayCommand<string> AddCommand { get; set; }

    public MainWindowViewModel()
    {
        AddCommand = new RelayCommand <string>(Show);
    }
    
    private void Show(string str)
    {
        Title = str;
    }
}

 

2.Messager消息传递

它是一种轻量级、简单易用的消息传递机制,可以有效地解耦 ViewModel 和 View 的依赖关系,从而提高代码的可维护性和可测试性。

/// <summary>
/// 注册订阅事件  (在 View 或 ViewModel 中注册对特定消息的处理方法)
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="recipient">订阅实例</param>
/// <param name="token">发送与接收定义的key值</param>
/// <param name="action">订阅事件触发的action</param>
/// <param name="keepTargetAlive">持续控制实例存在,防止被回收清除</param>
public void Register<TMessage>(object recipient, object token, Action<TMessage> action, bool keepTargetAlive = false);
 
/// <summary>
/// 注销订阅事件  (取消在 View 或 ViewModel中对特定消息的处理方法的注册)
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="recipient">订阅实例</param>
/// <param name="token">发送与接收定义的key值</param>
void Unregister<TMessage>(object recipient, object token);
 
/// <summary>
/// 被订阅方触发事件  (在 ViewModel中发送消息,将消息发送给已经注册了该消息的所有接收器)
/// </summary>
/// <typeparam name="TMessage">传参类型</typeparam>
/// <param name="message">参数数据</param>
/// <param name="token">key</param>
public void Send<TMessage>(TMessage message, object token);

注册消息:

public MainWindow()
{
    // InitializeComponent call is required to merge the UI
    // that is defined in markup with this class, including  
    // setting properties and registering event handlers           
    InitializeComponent();
    this.DataContext = new MainWindowViewModel();
    Messenger.Default.Register<string>(this,"token1",(info)=> { MessageBox.Show(info); });
}

发送消息:

private void Show(string str)
{
    Title=str;
    Messenger.Default.Send<string>("hello", "token1");
}

注销消息:

Messenger.Default.Unregister<string>(this, "token1");

 

标签:订阅,object,string,MVVMLight,void,使用,Show,简单,public
From: https://www.cnblogs.com/xixi-in-summer/p/17968208

相关文章

  • Celery 任务路由的使用,在多任务时,实现分组管理任务
    Celery任务路由的使用,在多任务时,实现分组管理任务Celery任务路由的使用,本文参考了国外大佬的文章,并做了修改与补充,原文见这里,BjoernStielCelery官方文档:RoutingTasks任务路由的主要作用:把任务分类,让他们在不同队列中运行,互不干扰,同时方便管理本文介绍3种任务路由添加......
  • 【Vue】Vue中 Vconsole 的使用 移动端调试神器vConsole
    【Vue】Vue中Vconsole的使用:https://blog.csdn.net/m0_53715482/article/details/125590180?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170539699116800182121287%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=1705396991168......
  • openEuler欧拉使用sshpass不输入密码远程登录其他服务器
    ssh登陆不能在命令行中指定密码,sshpass的出现则解决了这一问题。用-p参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。操作步骤:一、关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld二、安装sshpassdnf-yinstallsshpass三......
  • thinkphp5详细使用阿里云短信最新版
    1.我们下载官方完整包,PHP版本 https://help.aliyun.com/document_detail/55359.html?spm=5176.doc55451.6.580.3rgXTq 解压后得到目录2.将目录里的api_sdk复制出来到tp5根目录的extend下面文件夹复制过去后,我们最好更改一下名称,比如我们更改为alisms。 3.使用方法直接......
  • Mygin实现简单的路由
    本文是Mygin第二篇目的:实现路由映射提供了用户注册静态路由方法(GET、POST方法)基于上一篇Mygin实现简单Http且参照Gin我使用了map数组实现简单路由的映射关系不同的method对应一个组,Gin框架初始化时map时初始化9个,因为支持的http.method刚好为9个packagehttp//Gin......
  • nextjs使用prisma连接MySQL
      第一步npminstall@prisma/client 第二步npxprismainit 生成了文件 第三步,修改文件内容 第四步 第五步测试一下,执行npxprismadbpull我里面有一个user表的,拉下来这样显示了 ......
  • 在 STM32 中使用环形队列的方式接收串口数据
    在STM32中使用环形队列的方式接收串口数据#include<stdio.h>#include<stm32f10x.h>#include<stm32f10x_usart.h>//定义环形队列的结构体typedefstruct{uint8_t*buffer;//数据缓冲区uint16_tsize;//缓冲区大小uint16_tfront;//队列头索引......
  • Mygin 实现简单Http
    本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架目的简单介绍net/http库以及http.Handler接口实现简单的功能标准库启动Web服务import"net/http"funchelloHandler(whttp.ResponseWriter,r*http.Request){ w.Write([]byte("hellowor......
  • argo-rollout使用--金丝雀结合ingress-nginx
    1.金丝雀发布流程,安装比例发布,又名灰度发布举例:共10pod第一批发布30%V1:10个PodV2:3个Pod第二批发布60%V1:10个PodV2:6个Pod第三批发布100%V1:10个PodV2:10个Pod第四批发布V2:10个Pod(active)V1:0个Pod 2.资源文件准备文......
  • springboot~shardingsphere在非spring框架中的使用
    shardingsphere已经很方便的被springboot集成了,你只要引入sharding-jdbc-spring-boot-starter这个包就可以了,而如果是原生java的话,你就需要自己去实现了,主要是重新定义数据源,定义规则等问题,本文主要介绍原生环境下的shardingsphere的使用。依赖引用<dependencies><!--......