gpt4 book ai didi

c# - WPF MVVM 从代码隐藏调用 ViewModel 方法

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:12 25 4
gpt4 key购买 nike

首先,我对 WPF MVVM 很陌生,有点困惑。人们说,通常在 MVVM 中,最佳实践是不要有任何代码隐藏。我发现有些方法在代码隐藏中比在 View 模型中更容易实现(例如 MouseMove),这让我开始思考以下两个示例的区别:

1) 使用RelayCommand:

查看

<Button Command="{Binding AlertCommand}"></Button>

View 模型

public RelayCommand AlertCommand { get; set; }

public void Alert()
{
MessageBox.Show("message");
}

2) 从代码隐藏调用 ViewModel 方法:

查看

<Button PreviewMouseLeftButtonUp="OnMouseLeftButtonUp"></Button>

查看后面的代码

private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var ctx = (MainViewModel) this.DataContext;
ctx.Alert();
}

这里使用代码是不是错了?不使用代码隐藏对我有什么好处?

最佳答案

MVVM 模式是构建 UWP、WPF 和 Xamarin.Forms 应用程序时的最佳实践。主要优点是您可以将逻辑与表示分离,并有可能通过多个不同的 View 呈现一个单个 View 模型,并且可以切换 View 而无需修改查看模型显着。在使用 native UI 构建跨平台应用程序时,这是一个很大的优势,例如,MvvmCross 框架在很大程度上使用了它。

然而,拥有一个空的代码隐藏绝对只是一种理想,这通常并不容易,而且并不总是需要实现。有时您需要使用代码隐藏来进行纯粹与 View 相关的操作,例如针对不同的窗口大小更改布局、控制动画等。对于此类操作,代码隐藏是一种比试图以某种方式将其强制进入 VM 更合适。

比较您的两种方法,使用基于 RelayCommand 的方法优于直接方法调用,因为它与方法本身的直接联系较少。如果需要,您可以在运行时将 VM 中的 RelayCommand 实例切换为不同的实现(调用不同的方法),并且由于绑定(bind)按钮现在可以执行不同的操作。这可以用于类似编辑器的应用程序,其中一些工具可能根据应用程序所在的当前上下文具有不同的功能。

此外,对于不提供 Command 的控件,您可以将 EventTriggerInvokeCommandAction 结合使用(均使用 Expression Blend SDK 定义) 这将允许您将事件“转换”为命令调用,即使使用您定义的 EventArgs 转换也是如此。

关于c# - WPF MVVM 从代码隐藏调用 ViewModel 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48315880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com