You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI中MVVM结合整洁架构的手势事件处理方案咨询

解决方案

方案一:抽象平台无关的事件模型(符合整洁架构)

这是最贴合整洁架构要求的做法,核心是把MAUI平台相关的类型转换成Core层自主定义的抽象类型,让ViewModel完全独立于平台。

  1. 在Core层定义平台无关的枚举和数据类
// Core/Enums/PanStatus.cs
public enum PanStatus
{
    Started,
    Running,
    Canceled,
    Completed
}

// Core/Models/PanUpdateData.cs
public class PanUpdateData
{
    public PanStatus Status { get; set; }
    public double TotalX { get; set; }
    public double TotalY { get; set; }
    // 按需添加其他需要的属性,比如DeltaX、DeltaY等
}
  1. 在View层转换MAUI事件数据并传递
    修改View里的事件处理方法,把PanUpdatedEventArgs转换成Core层的PanUpdateData:
private void PanGestureRecognizer_PanUpdated(object sender, PanUpdatedEventArgs e)
{
    var panData = new PanUpdateData
    {
        Status = e.StatusType switch
        {
            GestureStatus.Started => PanStatus.Started,
            GestureStatus.Running => PanStatus.Running,
            GestureStatus.Canceled => PanStatus.Canceled,
            GestureStatus.Completed => PanStatus.Completed,
            _ => PanStatus.Canceled
        },
        TotalX = e.TotalX,
        TotalY = e.TotalY
    };

    ((MyViewModel)BindingContext).PanUpdatedCommand.Execute(panData);
}
  1. ViewModel使用Core层类型实现命令
    现在ViewModel可以完全脱离MAUI依赖:
// Core/ViewModels/MyViewModel.cs
[RelayCommand]
private void PanUpdated(PanUpdateData data)
{
    switch (data.Status)
    {
        case PanStatus.Started:
            // 处理开始逻辑
            break;
        case PanStatus.Running:
            // 处理拖动中逻辑,使用data.TotalX、data.TotalY
            break;
        case PanStatus.Canceled:
            // 处理取消逻辑
            break;
        case PanStatus.Completed:
            // 处理完成逻辑
            break;
    }
}

方案二:将ViewModel移至Mobile层(快速但耦合平台)

如果项目规模较小、不需要跨平台复用Core层逻辑,或者追求快速开发,可以把ViewModel文件夹移到Mobile项目中。这样ViewModel可以直接引用MAUI的PanUpdatedEventArgs和GestureStatus,不需要额外转换。

但这种做法的弊端很明显:ViewModel和MAUI平台强耦合,违反了整洁架构“内层不依赖外层”的原则。后续如果要扩展到其他平台(比如WPF、Blazor),ViewModel的逻辑需要重构,也无法单独对Core层的业务逻辑进行独立测试。

总结

如果你的项目需要长期维护、追求跨平台复用或符合整洁架构规范,优先选方案一;如果是小型项目或快速迭代场景,可以考虑方案二,但要接受平台耦合的代价。

内容的提问来源于stack exchange,提问作者infinitesimal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:08:20