首先,我对WPF MVVM很新,有点困惑。人们说通常在MVVM中最好的做法是不要有任何代码。我发现有些方法在后面的代码中比在viewmodel中更容易实现(例如MouseMove
),这让我想到了以下两个例子之间的差异:
1)使用RelayCommand
:
查看
<Button Command="{Binding AlertCommand}"></Button>
视图模型
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();
}
这里使用的代码错了吗?不使用代码后我有什么好处?
答案 0 :(得分:3)
构建UWP,WPF和Xamarin.Forms应用程序时,MVVM模式是最佳实践。主要优点是您能够将逻辑与演示文稿分离,并且可能会通过多个不同的视图提供单一视图模型,并且可以切换视图而无需修改查看模型显着。在使用本机UI构建跨平台应用程序时,这是一个很大的优势,例如MvvmCross框架在很大程度上使用它。
然而,拥有一个空的代码隐藏绝对只是一个理想的,这通常不容易,并不总是必须实现。有时您需要使用代码隐藏进行纯粹与视图相关的操作,例如更改不同窗口大小的布局,控制动画等。对于此类操作,代码隐藏是一个比试图以某种方式强制进入虚拟机更合适。比较两种方法,使用基于RelayCommand
的方法比直接方法调用更可取,因为它与方法本身的直接联系较少。如果您愿意,可以在运行时切换VM中的RelayCommand
实例以实现不同的实现(调用不同的方法),并且由于绑定,按钮现在可以执行不同的操作。这可以在类似编辑器的应用程序中使用,其中某些工具可能具有基于应用程序所处的当前上下文的不同功能。
此外,对于不提供Command
的控件,您可以EventTrigger
与InvokeCommandAction
一起使用(均使用Expression Blend SDK定义),这将允许您“转换”即使使用您定义的EventArgs
转换。
答案 1 :(得分:0)
两者都是有效的方法。如果可能,第一个是优选的。我通常在没有命令绑定可用的事件上使用第二种方法。 “在MVVM中绝对没有代码隐藏”的概念值得商榷。任何直接属于视图(并且不是业务逻辑)且不能在VM中重用的代码都可以放在代码隐藏中,例如在第二个示例中连接事件。