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

   }

时间: 2024-10-13 11:16:41

wpf之mvvm基类的相关文章

WPF自定义窗口基类

WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名空间,还得加上命名空间),继承自定义窗口类后台代码也得修改为继承自自定义窗口exp: //继承Window类的自定义窗口类 namespace WPF_Study.Entity { using System.Windows; public class WindowBase:Window { private c

《Programming WPF》翻译 第9章 2.选择一个基类

原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类,并且说明了他们之间的继承关系.注意到,这决不是完整的继承关系图,只是简单的显示了一些你应该考虑的可能的基类. 无论你选择了哪一个基类,你的元素都会直接或间接地从FrameworkElement派生.这将提供routing事件,高级属性处理,动画,数据绑定,外观上的支持,样式,以及逻辑树的集成. 派生于Fram

WPF开发时光之痕日记本(二)—— WVVM基类

当我们用MVVM的时候要实现INotifyPropertyChanged,每次都要实现这个接口比较麻烦,所以基类的作用就体现出来了.代码如下: public class ViewModelBase : INotifyPropertyChanged, IDisposable { public event PropertyChangedEventHandler PropertyChanged; public bool IsInDesignMode; /// <summary> 显示名称 </

WPF之MVVM(Step2)&mdash;&mdash;自己实现DelegateCommand:ICommand

在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类.此篇主要介绍DelegateCommand来解决上面所遇到的问题. 首先,我们创建自己的DelegateCommand. 代码如下: /// <summary> /// 实现DelegateCommand /// </summary> class MyDelegateCommand : ICommand { /// <summary> /// 命令

浅析WPF中MVVM模式下命令与委托的关系

??各位朋友大家好,我是Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.最近因为项目上的原因开始接触WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种"复古"的软件系统的时候,你应该相信这类东西的确有它们存在的意义.与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系.由此我们可以推论出:一项不流行

CleanAOP实战系列--WPF中MVVM自动更新

CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: [email protected] QQ: 511363759 CleanAOP介绍:https://github.com/Jarvin-Guan/CleanAOP 前言 讲起WPF,开发模式MVVM是必不可少的,使用MVVM模式以后可以在View中写界面,需要使用到的数据则使用绑定的方式写到标签中,那么控制权就放到了ViewModel中,那么有一个需求是每一个使用MVVM者都会有的,就是在后台改变ViewModel的属

在WPF的MVVM框架中获取下拉选择列表中的选中项

文章概述: 本演示介绍如何在WPF的MVVM框架中,通过数据绑定的方式获取下拉列表中的选中项.程序运行后的效果如下图所示: 相关下载(代码.屏幕录像):http://pan.baidu.com/s/1sjwN357 在线播放:http://v.youku.com/v_show/id_XODA5OTYzMDU2.html 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] XAML代码如下所示: <Window x:Class="Demo02E

WPF简单MVVM实现

1. MVVM介绍: MVVM就是: Model -- 模型(现实中对象的抽象) View -- UI(用户界面) ViewModel -- UI界面的抽象(给View提供数据,并响应View的操作) 2. 关键是要能准确的进行ViewModel的建模,处理好View与ViewModel之间的关系 2.1. 只有2种关系: 数据传递 --- 双向,使用Binding实现: 操作传递 --- 单向(只从View传递给ViewModel),使用命令Command实现: 3. 开始 3.1. 首先创建

WPF: 在MVVM中使用Navigtaion

Navigation可以很方便的在页面间进行切换,但是在MVVM模式下,使用Naviation会有一个问题,切换的逻辑需要在ViewModel层完成,但是Navigation需要知道页面的实例或者Uri才能进行切换,那我们如何在ViewModel与UI分离的情况下,用Navigation完成页面的切换呢? 假如有一个程序如下所示,点击Switch之后会从Summary Page切换到另一个页面Detail Page: 在MVVM中,我们需要有三个ViewModel,一个是SummaryViewM