在您的XAML文件与ViewModel交谈后,MVVMLight在其他方面有用

时间:2017-10-30 00:31:54

标签: c# wpf xaml mvvm mvvm-light

据我了解,使用MVVM / MVVMLight的好处之一是将视图与模型分开,因此,建议使用MVVMLight这样的库,其实很清楚,事实上,我和#39; m使用MVVMLight来帮助将多页放在一起的机制但是我不完全理解的是,当你的页面(ViewModel和XAML文件)与每个页面交谈时,MVVMLight的其他部分是有用的其他

例如,以下两个选项以相同的方式工作,除了在选项2中我使用MVVMLight,但我不完全理解的是我通过MVVMLight获得的内容。

使用选项2而不是选项1获得了什么?

有人可以举几个例子说明在您的XAML文件与ViewModel交谈后MVVMLight如何提供帮助吗?

选项1

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");
        }
    }
}    

选项2

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");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

  

据我了解,使用MVVM / MVVMLight的一个好处是将视图与模型分开......

这就是模式本身的作用。 MVVM只不过是一种设计模式。如果您愿意,可以自行实施,而无需使用任何第三方库,例如MvvmLightPrism

使用库的主要好处是它为您提供了开箱即用的MVVM应用程序所需的大部分功能。例如,这包括一个引发实现INotifyPropertyChanged接口的基类,并引发更改通知和ICommand接口的实现。

在您的示例中,您将使用ViewModelBaseRelayCommand类。如果您没有使用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现在可以间接控制用户界面,无需直接了解命令的使用方式。