WPF MVVM从

时间:2018-01-18 07:30:30

标签: c# wpf mvvm

首先,我对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();
}

这里使用的代码错了吗?不使用代码后我有什么好处?

2 个答案:

答案 0 :(得分:3)

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

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

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

此外,对于不提供Command的控件,您可以EventTriggerInvokeCommandAction一起使用(均使用Expression Blend SDK定义),这将允许您“转换”即使使用您定义的EventArgs转换。

,也可以使用命令调用的事件

答案 1 :(得分:0)

两者都是有效的方法。如果可能,第一个是优选的。我通常在没有命令绑定可用的事件上使用第二种方法。 “在MVVM中绝对没有代码隐藏”的概念值得商榷。任何直接属于视图(并且不是业务逻辑)且不能在VM中重用的代码都可以放在代码隐藏中,例如在第二个示例中连接事件。