wpf之mvvm基类

当我们用MVVM设计模式的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了。代码如下:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
public class ViewModelBase : INotifyPropertyChanged, IDisposable
{
     public event PropertyChangedEventHandler PropertyChanged;
     public bool IsInDesignMode;
     /// <summary> 显示名称 </summary> 
     public virtual string DisplayName { get ; protected set ; }
 
     #region 构造
 
     public ViewModelBase()
     {
 
     }
     #endregion
 
     private void OnPropertyChanged( string propertyName)
     {
         if ( this .PropertyChanged != null )
         {
             this .PropertyChanged( this , new PropertyChangedEventArgs(propertyName));
         }
     }
     private static string GetProperyName( string methodName)
     {
         if (methodName.StartsWith( "get_" ) || methodName.StartsWith( "set_" ) ||
             methodName.StartsWith( "put_" ))
         {
             return methodName.Substring(4);
         }
         throw new Exception(methodName + " not a method of Property" );
     }
 
     protected void SetProperty<T>( ref T name, T value)
     {
         if ( object .Equals(name, value)) return ;
         name = value;
         string propertyName = GetProperyName( new System.Diagnostics.StackTrace( true ).GetFrame(1).GetMethod().Name);
         this .OnPropertyChanged(propertyName);
     }
 
     #region IDisposable Members
     public void Dispose()
     {
         this .OnDispose();
     }
     /// <summary> 
     /// 若支持IDisposable,请重写此方法,当被调用Dispose时会执行此方法。 
     /// </summary> 
     protected virtual void OnDispose()
     {
     }
     #endregion
}
public class CommandBase : System.Windows.Input.ICommand
{
     private Action<Object> _doWork;
     private readonly Func< object , bool > _canExecute;
 
     /// <summary> 
     /// 实例化一个CommandBase对象 
     /// </summary> 
     /// <param name="doWork">委托一个有object类型参数的命令执行函数</param> 
     /// <param name="canExecute">委托一个有object类型参数的命令是否能被执行的函数(可选)</param> 
     /// <exception cref="ArgumentNullException">参数command不可以为null引用</exception> 
     public CommandBase(Action< object > doWork, Func< object , bool > canExecute = null )
     {
         if (doWork == null )
             throw new ArgumentNullException( "doWork" );
 
         _canExecute = canExecute;
         _doWork = doWork;
     }
     public bool CanExecute(Object parameter)
     {
         return true ;
     }
     public void Execute(Object parameter)
     {
         if ( this ._doWork != null )
             this ._doWork(parameter);
     }
     public event EventHandler CanExecuteChanged
     {
         add { }
         remove { }
     }
}

  使用方式如下,例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class TestViewModel : ViewModelBase
    {
        public TestViewModel()
        {
            this .LoadCommand = new CommandBase((Object parameter) => Loading());
        }
        #region 属性
        
        private string _name;
 
        /// <summary> 是否可用 </summary>
        public string IsEnable
        {
            get { return _name; }
            set
            {
                base .SetProperty< string >( ref this ._name, value);
            }
        }
        #endregion
 
        #region 命令
 
        /// <summary>
        /// 窗口加载命令
        /// </summary>
        public ICommand LoadCommand { get ; set ; }
        #endregion
 
        #region 方法
 
        /// <summary>
        /// 初始化方法
        /// </summary>
        public void Loading()
        {
 
        }
        #endregion
    }

转载于:https://www.cnblogs.com/dairuiqing/p/4308285.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值