用开源AOP简化MVVM框架
本文的前提是知晓基于Xaml开发,本文以WPF为例
一 、简化属性通知事件
普通的属性通知会写一个基于INotifyPropertyChanged接口的类
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写起来也是比较麻烦的
使用Fody/PropertyChanged可省去此麻烦
项目地址:https://github.com/Fody/PropertyChanged
使用方式如下,转自官方
[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:这个属性是说跳过相等的检查,没有实例,我也没有用过
二、简化ICommand的绑定事件
如果绑定一个Button 的点击事件,正常的后台是写一个DeletedCommand的属性
1 private DelegateCommand _clickCommand; 2 3 public DelegateCommand ClickCommand 4 { 5 get 6 { 7 return _clickCommand; 8 } 9 set 10 { 11 if (_clickCommand == null) 12 { 13 _clickCommand = new DelegateCommand(Click()); 14 } 15 else 16 { 17 _clickCommand = value; 18 } 19 } 20 } 21 22 [OnCommand("ClickCommand")] 23 private Action Click() 24 { 25 throw new NotImplementedException(); 26 }
然后前台绑定这个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个方法 OnCommand , OnCommandCanExecute
如有问题请参照项目说明和示例,本人只是恰巧看到了这2个简单的Fody的项目,简单用一下而已
</div>