mvvm-light开始使用mvvm-light


备注

MVVM-light是一个用C#编写的工具包,它有助于加速WPF,Silverlight,Windows Store,Windows Phone和Xamarin中MVVM应用程序的创建和开发。

网页: http//www.mvvmlight.net/

有一个来自该库的作者的跨平台MVVM样本,可以在https://github.com/lbugnion/sample-crossplatform-flowers找到

ObservableObject

ObservableObject 类包含一些有用的方法来帮助MVVM模式。

RaisePropertyChanged 提供了一个编译安全方法来引发属性更改事件。
它可以调用

RaisePropertyChanged(() => MyProperty);
 

可以在属性设置器中使用Set 方法来设置新值并引发属性更改事件(仅在发生更改时)。如果发生更改,则返回true ,否则返回false
示例用法:

private string _myValue;
public string MyValue    
{
    get { return _myValue; }
    set { Set(ref _myValue, value); }
}
 

RelayCommand

所述RelayCommand 实现ICommand 接口,因此可用于结合Command 在XAML S(作为Command 的的属性Button 元件)

构造函数有两个参数;第一个是在调用ICommand.Execute 执行的Action (例如用户点击按钮),第二个是Func<bool> ,它确定是否可以执行操作(默认为true,名为canExecute in以下段落)。

基本结构如下:

public ICommand MyCommand => new RelayCommand(
    () =>
    {
        //execute action
        Message = "clicked Button";
    },
    () =>
    {
        //return true if button should be enabled or not
        return true;
    }
);
 

一些值得注意的影响:

  • 如果canExecute 返回false,则将禁用该用户的Button
  • 在真正执行操作之前,将再次检查canExecute
  • 你可以调用MyCommand.RaiseCanExecuteChanged(); 强制重新评估canExecute Func

RelayCommand

RelayCommand<T> 类似于RelayCommand ,但允许直接将对象传递给命令。它实现了ICommand 界面,因此可用于结合Command S IN XAML(例如,作为该Command 的的属性Button 元素)。然后,您可以使用CommandParameter 属性将对象传递给命令。

XAML示例:

<Button Command="{Binding MyCommand}" CommandParameter="{Binding MyModel}" />
 

构造函数有两个参数;第一个是在调用ICommand.Execute时执行的Action(例如用户点击按钮),第二个是Func <string,bool>,它确定是否可以执行操作(默认为true,调用canExecute在以下段落中)。基本结构如下:

public RelayCommand<string> MyCommand => new RelayCommand<string>(
    obj =>
    {
        //execute action
        Message = obj;
    },
    obj =>
    {
        //return true if button should be enabled or not
        return obj != "allowed";
    }
);
 

一些值得注意的影响:

  • 如果canExecute 返回false ,则将禁用该用户的Button
  • 在真正执行操作之前,将再次检查canExecute
  • 你可以调用MyCommand.RaiseCanExecuteChanged(); 强制重新评估canExecute Func

ViewModelBase

ViewModelBase 扩展了ObservableObject 并添加了一些对viewmodel有用的方法。

属性IsInDesignModeIsInDesignModeStatic 允许确定代码是否在设计模式(在Visual Studio设计视图中)中执行。这两个属性完全相同。