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。

相关推荐
2601_962174179 小时前
Redis 简介
数据库·redis·wpf
SamChan902 天前
Python+PyMuPDF提取PDF表格并翻译:表格结构检测与双语重建实战
windows·python·ai·pdf·wpf
SamChan902 天前
Python+OpenCV检测PDF翻译后排版偏移:像素级格式一致性验证
python·opencv·ai·pdf·wpf
FuckPatience2 天前
WPF 拿到控件的最初样式,修改获得焦点样式
wpf
主宰者2 天前
【WPF】MainWindow前添加加载窗口,发现加载过程中有白色无内容窗口闪烁一下的解决方案
wpf
Vae_Mars3 天前
WPF中的ControlTemplate(控件模板)
wpf
SamChan903 天前
Python+ReportLab自动生成PDF翻译质量审计报告:从数据到可视化的完整方案
开发语言·python·ai·pdf·wpf
circuitsosk3 天前
多智能体协同在能源数据分析中的实践:分配-执行-校验闭环架构设计
python·数据分析·wpf·能源·并行计算·多智能体系统·agent协作
weixin199701080164 天前
《大促护航:电商API限流与降级,双11峰值500万调用的架构复盘》(附Python源码)
python·架构·wpf
hh9504 天前
gent Plan x DeepSeek Harness:多 Agent 协作场景下的中央编排实践
人工智能·wpf·adg·火山引擎·agent plan·adg成都社区