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。

相关推荐
User_芊芊君子1 天前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
就是有点傻3 天前
WPF按钮走马灯效果
wpf
zuozewei3 天前
虚拟电厂聚合商平台安全技术体系深度解读
安全·wpf
极客智造3 天前
WPF 自定义控件:AutoGrid 实现灵活自动布局的网格控件
wpf
极客智造3 天前
WPF Grid 布局高效扩展:GridHelpers 附加属性工具类全解析
wpf
张人玉3 天前
WPF 多语言实现完整笔记(.NET 4.7.2)
笔记·.net·wpf·多语言实现·多语言适配
暖馒3 天前
深度剖析串口通讯(232/485)
开发语言·c#·wpf·智能硬件
我要打打代码3 天前
WPF控件(2)
wpf
c#上位机3 天前
wpf之行为
c#·wpf
kylezhao20193 天前
深入浅出地理解 C# WPF 中的属性
hadoop·c#·wpf