(一)项目准备及登录模块
1.创建数据库

2.创建项目
- 框架wpf .net framework4.7.2
- sql server
- nuget
![image]()
3. 连接数据库





数据库发生更改时

- 此时是先在dbms设计表,然后添加实体数据模型,会自动生成表的实体类。
- 生成一个实体类集合OrderDBEntities继承了EF上下文DbContext(工作单元和存储库模式的组合)
- DbSet表示上下文中指定类型的所有实体的集合或可从数据库中查询的指定类型的所有实体的集合。
4.编写CRUD
public interface IProvider<T> where T : class
{
int Insert(T entity);
int Update(T entity);
int Delete(T entity);
List<T> GetAll();
}
- 设置一个接口,包含CRUD方法,四张表的服务层分别实现他
- OrderDBEntities可以看作就是一个仓库中间商
- 把他放到一个基类,让后面的服务层继承他,就可以直接调用他来做CRUD
public abstract class ProviderBase
{
protected OrderDBEntities db = null;
public ProviderBase()
{
db = new OrderDBEntities();
}
}
- 一个具体的服务层怎么写
![image]()
5. 登录模块
- 新建一个登录窗体和对应的view model
- 登录页面的大致编写
![image]()
- mvvmlight的使用
![image]()
绑定上下文,locator就是app.xaml里面的资源ViewModelLocator
ViewModelLocator里面先注册(Register)登录窗口到IOC中
path就是要执行的方法
![image]()
- 密码验证MD5,创建一个MD5验证方法类
public static string GetMD5(string password)
{
byte[] result=Encoding.Default.GetBytes(password);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] output = md5.ComputeHash(result);
password =BitConverter.ToString(output).Replace("-","");
return password;//返回加密后的数据
}
- LoginViewModel数据业务层中
-
先实例化用户的服务类,调用他来访问数据库核实用户名和密码
![image]()
-
登录后的窗体切换
把登录窗体作为命令参数传入,命令用泛型格式
![image]()
![image]()
-
注意:数据库中存的密码是MD5加密后的,所以不可以直接与文本输入框的对比,给member加一个部分类,添加一个用于存放前台数据的字段
![image]()
-
passwordBox里面的数据实现数据绑定太复杂,可以直接加个空间名,因为窗体已经作为参数传入了,可以直接拿到控件的值。
![image]()
学习知识点
1.关于C#中泛型类型参数约束(where T : class)
NET支持的类型参数约束有以下五种:
where T : struct | T必须是一个结构类型
where T : class | T必须是一个Class类型
where T : new() | T必须要有一个无参构造函数
where T : NameOfBaseClass | T必须继承名为NameOfBaseClass的类
where T : NameOfInterface | T必须实现名为NameOfInterface的接口
2. MvvmLight
ViewModelLocator
在.netFramework环境下nuget安装MvvmLight会自动安装依赖项MvvmLightLibs库,如果在.net core环境下需要手动安装MvvmLightLibs库。
.netFramework环境下安装完成后,在ViewModel目录下具有一个 ViewModelLocator类,该类的作用是提供依赖注入容器和相关属性。

这句大概意思:实例化一个ViewModelLocator
这样在MainWindow中就可以这样注册DataContext
<Window DataContext="{Binding Source={StaticResource Locator}, Path=Main}">
ObservableObject
ObservableObject继承了INotifyPropertyChanged,主要是简化了属性改变事件的触发
ViewModelBase
ViewModelBase继承了ObservableObject和Icleanup接口,自定义的ViewModel可以自己选择是否要继承ViewModelBase,该类中IsInDesignMode可以用来判断是否属于设计状态中。该类中另一常用的方法是Cleanup虚方法,用于进行资源释放。
资源释放
有时在某个VM中开启一个线程,当关闭View时,对应的VM中的线程仍然不会释放,此时就需要对VM中的线程资源进行释放。
RelayCommand
RelayCommand继承自ICommand,用法和RouteCommand类似
public ICommand BtnCommand
{
//get => new RelayCommand(() => { });
//带参数
get => new RelayCommand<string>(obj =>
{ });
//如果泛型定义为int则会转换失效,这里的泛型一般是引用,不能是值类型,因为用的反射机制
}
//任意事件的处理
public ICommand MouseCommand
{
get => new RelayCommand<object>(obj=>
{ });
}












浙公网安备 33010602011771号