据我了解,使用MVVM / MVVMLight的好处之一是将视图与模型分开,因此,建议使用MVVMLight这样的库,其实很清楚,事实上,我和#39; m使用MVVMLight来帮助将多页放在一起的机制但是我不完全理解的是,当你的页面(ViewModel和XAML文件)与每个页面交谈时,MVVMLight的其他部分是有用的其他
例如,以下两个选项以相同的方式工作,除了在选项2中我使用MVVMLight
,但我不完全理解的是我通过MVVMLight获得的内容。
使用选项2
而不是选项1
获得了什么?
有人可以举几个例子说明在您的XAML文件与ViewModel交谈后MVVMLight如何提供帮助吗?
XAML
<Button Content="Button" Command="{Binding FindPdfFileCommand}"/>
ViewModel .cs
namespace Tool.ViewModel
{
public class FindrViewModel : ViewModelBase
{
public ICommand FindPdfFileCommand{get;private set;}
public FindrViewModel(){ FindPdfFileCommand = new RelayCommand(() => FindPdfFile_Click());}
private void FindPdfFile_Click()
{
Console.WriteLine("Button clicked");
}
}
}
XAML
xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
xmlns:Custom="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<Button x:Name="button" Content="Button">
<Custom:Interaction.Triggers>
<Custom:EventTrigger EventName="Click">
<GalaSoft_MvvmLight_Command:EventToCommand x:Name="ClickMeEvent" Command="{Binding FindPdfFileCommand, Mode=OneWay}" />
</Custom:EventTrigger>
</Custom:Interaction.Triggers>
</Button>
ViewModel .cs
namespace Tool.ViewModel
{
public class FindrViewModel : ViewModelBase
{
public ICommand FindPdfFileCommand{get;private set;}
public FindrViewModel(){ FindPdfFileCommand = new RelayCommand(() => FindPdfFile_Click());}
private void FindPdfFile_Click()
{
Console.WriteLine("Button clicked");
}
}
}
答案 0 :(得分:2)
据我了解,使用MVVM / MVVMLight的一个好处是将视图与模型分开......
这就是模式本身的作用。 MVVM只不过是一种设计模式。如果您愿意,可以自行实施,而无需使用任何第三方库,例如MvvmLight
或Prism
。
使用库的主要好处是它为您提供了开箱即用的MVVM应用程序所需的大部分功能。例如,这包括一个引发实现INotifyPropertyChanged
接口的基类,并引发更改通知和ICommand
接口的实现。
在您的示例中,您将使用ViewModelBase
和RelayCommand
类。如果您没有使用MvvmLight
,则必须自己实施。
EventToCommand
在这种情况下并没有用。它主要用于您希望将事件的EventArgs
作为命令参数传递给命令:http://blog.galasoft.ch/posts/2014/01/using-the-eventargsconverter-in-mvvm-light-and-why-is-there-no-eventtocommand-in-the-windows-8-1-version/。
您也可以直接绑定到命令属性:
Command="{Binding FindPdfFileCommand}"/>
但您仍在视图模型中使用MvvmLight
类型。
答案 1 :(得分:1)
RelayCommand(以及任何其他ICommand实现)在Execute操作之上添加了另一个关键功能 - 即CanExecute属性。
这允许您根据ViewModel对象的其他状态控制何时可以执行命令。当命令无法执行时,任何绑定按钮(或具有命令属性的其他控件,如menuitem)将自动禁用。 ViewModel现在可以间接控制用户界面,无需直接了解命令的使用方式。