VM访问View(Interaction)

引言

ViewModel访问View的场景非常常见,比如打开关闭窗口,访问剪切板等等,想操作前端View的一些功能和属性必须要View的引用。这里介绍一种非常高效的方式与View进行交互。当然有很多方式,比如回调函数、CommunityToolkit.MVVM的Messenger等

1、Interaction

相当于统一格式了,支持任意消息类型订阅处理。包含入参和返回值

cs 复制代码
public class Interaction<TIn, TOut>
{
    private Func<TIn, Task<Tout>>? _handler;

    public void RegisterHandler(Func<TIn, Task<TOut>> handler)
    {
        ArgumentNullException.ThrowIfNulL(handler);
        handler = handler;
    }

    public async Task<Tout> Handle(TIn input)
    {
        if(handler =null)
            throw new InvalidoperationException("No handler registered.");
        return await _handler(input);
    }
}

public readonly struct Unit
{
    public static readonly Unit Default = default;
    public override int GetHashCode() => 0;
    public override bool Equals(object? obj) => obj is Unit;
}

1.1、VM中使用

这样再在ViewModel中声明一个实例使用:

cs 复制代码
public Interaction<Unit,string> RequestMessageInteraction{get;} = new();
[RelayCommand]
private async Task UseInteraction()
{
    IsBusy = true;
    Message = await RequestMessageInteraction.Handle(Unit.Default);
    IsBusy = false;
}

1.2、View中订阅

cs 复制代码
public MainWindow()
{
    InitializeComponent();
    var viewModel = new MainViewModel();
    this.DataContext = viewModel;
    
    viewModel.RequestMessageInteraction.RegisterHandler(async _ =>
    {
        await Task.Delay(2000);
        return "Hello from MainWindow with Interaction!";
    });
}

一般通过依赖注入进行VM的实例设置,这里简单实例化了一个MainViewModel。

相关推荐
掘根2 小时前
【jsonRpc】项目介绍
wpf
工业甲酰苯胺2 小时前
C#中的多级缓存架构设计与实现深度解析
缓存·c#·wpf
cjp56020 小时前
020.WPF MVVM数据绑定底层原理类封装
wpf
黑夜中的潜行者1 天前
构建高性能 WPF 大图浏览器:TiledViewer 技术解密
性能优化·c#·.net·wpf·图形渲染
yy7634966681 天前
WPF样式入门:5分钟学会自定义Button样式
wpf
她说彩礼65万1 天前
WPF路由事件作用
wpf
LcVong1 天前
WPF DataGrid 全属性详解(分类整理+实用说明)
wpf
Greyscarf1 天前
WPF使用MxDraw云图插件入门
wpf·mxdraw云图·mxdraw
执笔论英雄2 天前
【大模型推理】VLLM 引擎使用
wpf·vllm