🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
3)视图模型层DynamicDataViewModel .cs ~~~ using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using MAppStructure.Datasource; using System.ComponentModel; using System.Collections.Generic; using MEntities; namespace MAppStructure.ViewModel {    /// <summary>    /// 视图模型层,注意必须实现INotifyPropertyChanged接口,这样VM层才能绑定。    /// ViewModel可以做一个基类,这个基类主要是实现INotifyPropertyChanged接口    /// 和你需要的一些公共方法,这里为了简单些,就没有做基类了.    /// </summary>    public class DynamicDataViewModel : INotifyPropertyChanged    {        /// <summary>        /// 视图模型层主要采用的模型层服务实例,注意        /// 可以调用多个模型层得服务实例,这里是演示,所以只做了一个。        /// </summary>        private DynamicDataSource theS;        public DynamicDataViewModel()        {            theS = new DynamicDataSource();            //初始化并注册命令.            Commands = new Dictionary<string, MyCommand>();            Commands.Add("Button1Command", new MyCommand(OnButtonCommand));        }        private void OnButtonCommand(object parameter)        {            LoadData();            MessageBox.Show("ok");        }               /// <summary>        ///命令字典集合,这样做的好处一是可以减少定义命令的硬代码,同时提供了一种动        ///态命令的可能性,并有利于扩展.        /// </summary>        public Dictionary<string, MyCommand> Commands        {            get;            private set;        }        private List<DynamicDataRow> _DataSource;        public List<DynamicDataRow> DataSource        {            get            {                return _DataSource;            }            private set            {                _DataSource = value;                RaisePropertyChanged("DataSource");                          }        }        private DynamicDataTable _DataTable;        /// <summary>        /// 获取来的动态数据表.        /// </summary>        public DynamicDataTable DataTable        {            get            {                return _DataTable;            }            private set            {                _DataTable = value;                RaisePropertyChanged("DataTable");            }        }        /// <summary>        /// 数据加载.        /// </summary>        private void LoadData()        {            theS.GetDynamicDataTable("select * from EmployeeInfo ", op =>                {                    if (op.HasError == false)                    {                        DataSource = op.Value.Rows;                        DataTable = op.Value;                    }                    else                    {                        MessageBox.Show(op.ErrorMsg);                    }                }, null);        }        public event PropertyChangedEventHandler PropertyChanged;        protected void RaisePropertyChanged(string propertyName)        {            var handler = PropertyChanged;            if (handler != null)            {                handler(this, new PropertyChangedEventArgs(propertyName));            }        }    }    /// <summary>    /// 自己的命令类,主要为了命令的绑定.这里是典型的命令模式,命令的接收者是本VM.不过这里的    /// 命令接收者并没有作为命令的成员,而是采用委托方式,在这种情况下更为便利。    /// </summary>    public class MyCommand : ICommand    {        public bool CanExecute(object parameter)        {            return true;        }        private Action<object> _action;        public MyCommand(Action<object> Action)        {            this._action = Action;        }        public event EventHandler CanExecuteChanged;        public void Execute(object parameter)        {            if (_action != null)            {                _action(parameter);            }        }    } } ~~~ 这里大家注意的是,我的命令采用的不是一般的定义方式,而是采用字典集合的方式进行,好处上面讲了,请大家注意页面的绑定方式。