用开源AOP简化MVVM框架

本文的前提是知晓基于Xaml开发,本文以WPF为例git

 

一 、简化属性通知事件github

普通的属性通知会写一个基于INotifyPropertyChanged接口的类this

 1 public class RasiePropertyChanged : INotifyPropertyChanged
 2     {
 3         public event PropertyChangedEventHandler PropertyChanged;
 4 
 5         protected void OnPropertyChanged([CallerMemberName]string propertyName = null)
 6         {
 7             PropertyChangedEventHandler handler = PropertyChanged;
 8             if (handler != null)
 9             {
10                 handler(this, new PropertyChangedEventArgs(propertyName));
11             }
12         }
13 
14     }

这样用时就能够在属性的Set里最后加上一句RasiePropertyChanged();就能够,可是若是属性只是简单的Get,Set写起来也是比较麻烦的spa

使用Fody/PropertyChanged可省去此麻烦code

项目地址:https://github.com/Fody/PropertyChangedorm

使用方式以下,转自官方blog

[ImplementPropertyChanged]
public class Person 
{        
    public string GivenNames { get; set; }
    public string FamilyName { get; set; }

    public string FullName
    {
        get
        {
            return string.Format("{0} {1}", GivenNames, FamilyName);
        }
    }
}

在类上边写上一个Attribute [ImplementPropertyChanged],类里的全部属性就都实现了属性通知事件接口

DoNotNotify:若是有某个属性不想实现通知事件,就在相应属性上加个[DoNotNotify]事件

AlsoNotifyFor:若是有某个属性像上边的FullName同样是2个属性的组合,任何一个变化都要通知都FullName变化,就在子属性GivenNames 和FamilyName上加个[AlsoNotifyFor("FullName")]开发

DependsOn:若是反过来FullName变了也让子属性变化,那就要在FullName上加上[DependsOn("GivenName","FamilyName")]

DoNotSetChanged:这个属性是说当FullName 的Set改变时,不会通知到子属性

DoNotCheckEquality:这个属性是说跳过相等的检查,没有实例,我也没有用过

 

2、简化ICommand的绑定事件

若是绑定一个Button 的点击事件,正常的后台是写一个DeletedCommand的属性

 1 private ICommand _clickCommand;
 2 
 3         public ICommand ClickCommand
 4         {
 5             get { return _clickCommand ?? new DelegateCommand(Click); }
 6             set { _clickCommand = value; }
 7         }
 8 
 9         10         private Action Click()
11         {
12             throw new NotImplementedException();
13         }

而后前台绑定这个ClickCommand
使用Fody/Commander.Fody可省去写ICommand的属性

项目地址:https://github.com/DamianReeves/Commander.Fody

使用方式以下,转自官方

1 [OnCommand("ClickCommand")]
2         private Action Click()
3         {
4             throw new NotImplementedException();
5         }

如此就能够了
可是ICommand接口有2个方法,一个是Execute,一个是CanExecute

因此属性天然也是有2个,分别对应这2个方法OnCommandOnCommandCanExecute

 

若有问题请参照项目说明和示例,本人只是恰巧看到了这2个简单的Fody的项目,简单用一下而已

相关文章
相关标签/搜索