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();
        }
    }
}
posted @ 2024-12-03 17:25  青云Zeo  阅读(3)  评论(0编辑  收藏  举报