WPF笔记8——与MVVM有关的文件夹
WPF项目使用MVVM时,要在项目中创建对应的文件夹:Command、Model、Service、View、ViewModel,
如下图:
(1)View文件夹:用来存放窗口、usercontrol;
(2)ViewModel文件夹:存放ViewModel类(View类需要绑定的属性、命令都定义在对应的ViewModel类中);
ViewModeld对象中通常会包含Model对象的引用;
//ObjectPropertyNotified是ViewModel类的基类
public class ObjectPropertyNotified : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public void RaisePropertyNotifiedChanged(string propteryname)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propteryname));
}
}
//定义自己的ViewModel类
//ViewModel类就是与界面绑定(属性绑定、命名绑定)有关类
public class CompulateViewModel : ObjectPropertyNotified
{
#region 字段及属性
private CompulateEntity entity;
public double Input1
{
get
{
return entity.Input1;
}
set
{
entity.Input1 = value;
this.RaisePropertyNotifiedChanged(nameof(Input1));
}
}
public double Input2
{
get
{
return entity.Input2;
}
set
{
entity.Input2 = value;
this.RaisePropertyNotifiedChanged(nameof(Input2));
}
}
public double Input3
{
get
{
return entity.Input3;
}
set
{
entity.Input3 = value;
this.RaisePropertyNotifiedChanged(nameof(Input3));
}
}
#endregion
#region 命令方法
public DeletegateCommand AddCommand { get; set; }
public DeletegateCommand SaveCommand { get; set; }
public void AddAction(Object? parameter)
{
Input3 = Input2 + Input1;
}
public void SaveAction(Object? parameter)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.ShowDialog();
}
#endregion
/// <summary>
/// ViewModel的构造
/// </summary>
public CompulateViewModel()
{
entity= new CompulateEntity();
AddCommand = new DeletegateCommand(AddAction, new Func<object?, bool>(x => { return true; }));
SaveCommand = new DeletegateCommand(SaveAction, new Func<object?, bool>(x => { return true; }));
}
}
(3)Command文件夹:用来存放各种命令列或命令接口;
public class DeletegateCommand : ICommand
{
Action<object?> ExecuteAction { get; set; }
Func<object?, bool> CanExecuteFunc { get; set; }
public event EventHandler? CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
public DeletegateCommand(Action<object?> executeAction, Func<object?, bool> canExecuteFunc)
{
ExecuteAction = executeAction;
CanExecuteFunc = canExecuteFunc;
}
public bool CanExecute(object? parameter)
{
if (CanExecuteFunc == null)
{
return true;
}
return CanExecuteFunc(parameter);
}
public void Execute(object? parameter)
{
ExecuteAction?.Invoke(parameter);
}
}
(4)Model文件夹:主要用于处理数据结构和业务逻辑相关的数据对象;
public class CompulateEntity
{
public double Input1 { get; set; }
public double Input2 { get; set; }
public double Input3 { get; set; }
}
(5)Service文件夹:用来存放各类服务类,这些服务类通常用于处理一些与外部资源交互,或业务逻辑中相对独立的功能。
通常是与数据库、文件系统、网络或其他外部资源进行交互或则是业务逻辑等,提供数据给ViewModel使用。
例如:一个简单的数据访问服务ProductDataService可以用于从数据库或者其他数据源获取Product列表。
它可能有一个方法GetProducts(),在这个方法内部可能使用数据库连接库(如 Entity Framework 等)来查询数据库并返回产品列表
public class ProductDataService
{
public List<Product> GetProducts()
{
// 这里可以是从数据库获取产品列表的实际代码,例如使用Entity Framework
using (var context = new MyDbContext())
{
return context.Products.ToList();
}
}
}