提问人:budul 提问时间:10/28/2023 更新时间:10/29/2023 访问量:31
从 Avalonia 中的视图模型触发用户控件操作
Trigger a user control action from view model in Avalonia
问:
我在 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 中可用的依赖属性。
我正在寻找一种最有可能基于行为的解决方案。但也许还有其他解决方案,我还没有找到。
答:
0赞
Tarazed
10/29/2023
#1
一个常见的误解是,MVVM 意味着“没有代码”。MVVM 意味着视图逻辑只能通过松散耦合(即单向通信和事件/回调,并使用 INotifyPropertyChanged 通过 ViewModel 传递)与业务逻辑进行交互。模型不应直接引用视图或视图模型,它存在于自己的小世界中,只是调用事件和回调。视图不应直接引用模型,但可以直接引用视图模型,视图模型不应直接引用视图,但可以直接引用模型。单向通信,事件倒退。
您在这里拥有的是与视图模型中的事件挂钩的纯视图逻辑,这在概念上与绑定没有什么不同。绑定只是一种语法方式,用于监视视图模型上非常特定的事件并对其进行响应。View 注册事件,ViewModel 没有直接引用 MVVM 指示的 View。您在此处拥有的内容仍在 MVVM 模式中。
你可以使用 Avalonia Behaviors,但老实说,对于这个小事件连接,这是矫枉过正的,它会让你的代码变得复杂,只要它遵循 MVVM 模式,后面的代码就没有错。
评论