从 Avalonia 中的视图模型触发用户控件操作

Trigger a user control action from view model in Avalonia

提问人:budul 提问时间:10/28/2023 更新时间:10/29/2023 访问量:31

问:

我在 Avalonia 11 应用程序中使用 PanAndZoom conrol。不幸的是,此控件的缩放重置似乎只能由控制方法触发。

现在我想知道如何根据 MVVM 原则直接从视图模型触发 ResetMatrix 操作。

目前,我在视图的代码隐藏中调用此方法:

public partial class VideoView : UserControl
{
    #region Public Constructors

    public VideoView()
    {
        InitializeComponent();

        var zoomBorder = this.FindControl<ZoomBorder>("VideoBorder");
        var dataContext = this.DataContext as VideoViewModel;

        if (dataContext != default
            && zoomBorder != default)
        {
            dataContext.OnVideoCentredEvent += (s, e) => zoomBorder.ResetMatrix();
        }
    }

    #endregion Public Constructors
}

我已经找到了这个答案,但我无法将其调整为 Avalonia 11 中可用的依赖属性。

我正在寻找一种最有可能基于行为的解决方案。但也许还有其他解决方案,我还没有找到。

MVVM 用户控制 代码隐藏 行为 avalonia

评论


答:

0赞 Tarazed 10/29/2023 #1

一个常见的误解是,MVVM 意味着“没有代码”。MVVM 意味着视图逻辑只能通过松散耦合(即单向通信和事件/回调,并使用 INotifyPropertyChanged 通过 ViewModel 传递)与业务逻辑进行交互。模型不应直接引用视图或视图模型,它存在于自己的小世界中,只是调用事件和回调。视图不应直接引用模型,但可以直接引用视图模型,视图模型不应直接引用视图,但可以直接引用模型。单向通信,事件倒退。

您在这里拥有的是与视图模型中的事件挂钩的纯视图逻辑,这在概念上与绑定没有什么不同。绑定只是一种语法方式,用于监视视图模型上非常特定的事件并对其进行响应。View 注册事件,ViewModel 没有直接引用 MVVM 指示的 View。您在此处拥有的内容仍在 MVVM 模式中。

你可以使用 Avalonia Behaviors,但老实说,对于这个小事件连接,这是矫枉过正的,它会让你的代码变得复杂,只要它遵循 MVVM 模式,后面的代码就没有错。