1、ToDoView.xmal添加引用,添加微软的行为类
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
2、给项目添加行为
3、ToDoViewModel.cs新建查询SelectedCommand
public DelegateCommand SelectedCommand { get;private set; }
public ToDoViewModel(IToDoService toDoService, IContainerProvider provider) : base(provider)
{
ToDoDtos = new ObservableCollection();
AddCommand = new DelegateCommand(Add);
SelectedCommand = new DelegateCommand(Selected);
this.toDoService = toDoService;
}
private async void Selected(ToDoDto obj)
{
try
{
UpdateLoading(true);
var todoResult = await toDoService.GetFirstOfDefaultAsync(obj.Id);
if (todoResult.Status)
{
IsIsRightDrawerOpens = true;
CurrentDto = todoResult.Result;
}
}
catch (Exception)
{
throw;
}
finally
{
UpdateLoading(false);
}
}
4、新建属性编辑选中/新增时的对象
private ToDoDto currentDto;
///
/// 编辑选中/新增时的对象
///
public ToDoDto CurrentDto
{
get { return currentDto; }
set { currentDto = value; RaisePropertyChanged(); }
}
5、前台绑定文本标题、内容、状态
待办
已完成
6、F5运行项目,点击待办事项能在右侧显示信息
7、绑定搜索输入框,首先定义一个属性,前台绑定输入框的值Search,给输入框添加回车事件
private string search;
///
/// 搜索条件
///
public string Search
{
get { return search; }
set { search = value; RaisePropertyChanged(); }
}
8、SearchCommand搜索事件可以和上面AddCommand合并到一起,【添加待办】按钮设置事件:ExecuteCommand,参数设置="新增",查找框设置成ExecuteCommand,参数设置="查询"
public DelegateCommand ExecuteCommand { get; private set; }
public ToDoViewModel(IToDoService toDoService, IContainerProvider provider) : base(provider)
{
ToDoDtos = new ObservableCollection();
ExecuteCommand = new DelegateCommand(Execute);
SelectedCommand = new DelegateCommand(Selected);
this.toDoService = toDoService;
}
9、获取数据的函数里面把Search属性传进去
///
/// 获取数据
///
private async void GetDataAsync()
{
UpdateLoading(true);
var todoResult = await toDoService.GetAllPageListAsync(new WPFProjectShared.Parameters.QueryParameter
{
PageIndex = 0,
PageSize = 100,
Search = Search
});
if (todoResult.Status)
{
toDoDtos.Clear();
foreach (var item in todoResult.Result.Items)
{
toDoDtos.Add(item);
}
}
UpdateLoading(false);
}
10、新增Excute方法和Query方法
private void Execute(string obj)
{
switch (obj)
{
case "新增":Add();
break;
case "查询":Query();
break;
}
}
private void Query()
{
GetDataAsync();
}
11、F5运行项目,在搜索框里面查询显示12、【保存】事件,按钮添加绑定事件,修改Excute方法、新增Add方法和Save方法
private void Execute(string obj)
{
switch (obj)
{
case "新增":Add();
break;
case "查询":Query();
break;
case "保存":Save();
break;
}
}
///
/// 添加待办
///
///
private void Add()
{
CurrentDto = new ToDoDto();
IsIsRightDrawerOpens = true;
}
private async void Save()
{
if (string.IsNullOrWhiteSpace(CurrentDto.Title) || string.IsNullOrWhiteSpace(CurrentDto.Content))
{
return;
}
else
{
UpdateLoading(true);
try
{
if (CurrentDto.Id > 0)//update
{
var updateResult = await toDoService.UpdateAsync(CurrentDto);
if (updateResult.Status)
{
var todo = ToDoDtos.FirstOrDefault(t => t.Id == CurrentDto.Id);
if (todo != null)
{
todo.Title = CurrentDto.Title;
todo.Content = CurrentDto.Content;
todo.Status = CurrentDto.Status;
}
}
IsIsRightDrawerOpens = false;
}
else//add
{
var addResult = await toDoService.AddAsync(CurrentDto);
if (addResult.Status)
{
ToDoDtos.Add(addResult.Result);
IsIsRightDrawerOpens = false;
}
}
}
catch (Exception)
{
throw;
}finally { UpdateLoading(false); }
}
}
修改API中TodoController的代码
[HttpPost]
public async Task Update(TodoDto toDo)
{
return await toDoService.UpdateEntityAsync(toDo);
}
13、F5运行项目,测试修改待办
保存的时候报错:
{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-40d7073ee1cf77c77875996f55f65034-4888403c8bef54ca-00","errors":{"toDo":["The toDo field is required."],"$.Status":["The JSON value could not be converted to System.String. Path: $.Status | LineNumber: 0 | BytePositionInLine: 59."]}}
后来发现是实体类引用错误导致,重新引用WPFProjectShared.Dtos.TodoDto,
另外一个报错:
{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-25e255d827e2947f869ccba30a1714e4-b2423a142252e535-00","errors":{"$":["'-' is invalid within a number, immediately after a sign character ('+' or '-'). Expected a digit ('0'-'9'). Path: $ | LineNumber: 0 | BytePositionInLine: 1."],"toDo":["The toDo field is required."]}}
修改请求参数的格式application/json
ToDoView.xmal完整代码:
待办
已完成
ToDoViewModel.cs完整代码
using Prism.Commands;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPFProject.Common.Models;
using WPFProject.Service;
using WPFProjectShared.Dtos;
namespace WPFProject.ViewModels
{
public class ToDoViewModel : NavigationViewModel
{
private readonly IToDoService toDoService;
public ToDoViewModel(IToDoService toDoService, IContainerProvider provider) : base(provider)
{
ToDoDtos = new ObservableCollection();
ExecuteCommand = new DelegateCommand(Execute);
SelectedCommand = new DelegateCommand(Selected);
this.toDoService = toDoService;
}
private void Execute(string obj)
{
switch (obj)
{
case "新增":Add();
break;
case "查询":Query();
break;
case "保存":Save();
break;
}
}
private async void Save()
{
if (string.IsNullOrWhiteSpace(CurrentDto.Title) || string.IsNullOrWhiteSpace(CurrentDto.Content))
{
return;
}
else
{
UpdateLoading(true);
try
{
if (CurrentDto.Id > 0)//update
{
var updateResult = await toDoService.UpdateAsync(CurrentDto);
if (updateResult.Status)
{
var todo = ToDoDtos.FirstOrDefault(t => t.Id == CurrentDto.Id);
if (todo != null)
{
todo.Title = CurrentDto.Title;
todo.Content = CurrentDto.Content;
todo.Status = CurrentDto.Status;
}
}
IsIsRightDrawerOpens = false;
}
else//add
{
var addResult = await toDoService.AddAsync(CurrentDto);
if (addResult.Status)
{
ToDoDtos.Add(addResult.Result);
IsIsRightDrawerOpens = false;
}
}
}
catch (Exception)
{
throw;
}finally { UpdateLoading(false); }
}
}
private void Query()
{
GetDataAsync();
}
///
/// 添加待办
///
///
private void Add()
{
CurrentDto = new TodoDto();
IsIsRightDrawerOpens = true;
}
private async void Selected(TodoDto obj)
{
try
{
UpdateLoading(true);
var todoResult = await toDoService.GetFirstOfDefaultAsync(obj.Id);
if (todoResult.Status)
{
IsIsRightDrawerOpens = true;
CurrentDto = todoResult.Result;
}
}
catch (Exception)
{
throw;
}
finally
{
UpdateLoading(false);
}
}
public DelegateCommand ExecuteCommand { get; private set; }
public DelegateCommand SelectedCommand { get;private set; }
private bool isIsRightDrawerOpens;
///
/// 右侧新增窗口是否打开
///
public bool IsIsRightDrawerOpens
{
get { return isIsRightDrawerOpens; }
set { isIsRightDrawerOpens = value; RaisePropertyChanged(); }
}
private TodoDto currentDto;
///
/// 编辑选中/新增时的对象
///
public TodoDto CurrentDto
{
get { return currentDto; }
set { currentDto = value; RaisePropertyChanged(); }
}
private string search;
///
/// 搜索条件
///
public string Search
{
get { return search; }
set { search = value; RaisePropertyChanged(); }
}
private ObservableCollection toDoDtos;
public ObservableCollection ToDoDtos
{
get { return toDoDtos; }
set { toDoDtos = value; }
}
///
/// 获取数据
///
private async void GetDataAsync()
{
UpdateLoading(true);
var todoResult = await toDoService.GetAllPageListAsync(new WPFProjectShared.Parameters.QueryParameter
{
PageIndex = 0,
PageSize = 100,
Search = Search
});
if (todoResult.Status)
{
toDoDtos.Clear();
foreach (var item in todoResult.Result.Items)
{
toDoDtos.Add(item);
}
}
UpdateLoading(false);
}
public override void OnNavigatedTo(NavigationContext navigationContext)
{
base.OnNavigatedTo(navigationContext);
GetDataAsync();
}
}
}
备忘录也相应修改,完整代码如下:
MemoView.xmal
MemoViewModel.cs
using Prism.Commands;
using Prism.Ioc;
using Prism.Regions;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using WPFProject.Common.Models;
using WPFProject.Service;
using WPFProjectShared.Dtos;
namespace WPFProject.ViewModels
{
public class MemoViewModel : NavigationViewModel
{
private readonly IMemoService memoService;
public MemoViewModel(IMemoService memoService, IContainerProvider provider) : base(provider)
{
MemoDtos = new ObservableCollection();
ExecuteCommand = new DelegateCommand(Execute);
SelectedCommand = new DelegateCommand(Selected);
this.memoService = memoService;
}
private void Execute(string obj)
{
switch (obj)
{
case "新增":
Add();
break;
case "查询":
Query();
break;
case "保存":
Save();
break;
}
}
private async void Save()
{
if (string.IsNullOrWhiteSpace(CurrentDto.Title) || string.IsNullOrWhiteSpace(CurrentDto.Content))
{
return;
}
else
{
UpdateLoading(true);
try
{
if (CurrentDto.Id > 0)//update
{
var updateResult = await memoService.UpdateAsync(CurrentDto);
if (updateResult.Status)
{
var todo = MemoDtos.FirstOrDefault(t => t.Id == CurrentDto.Id);
if (todo != null)
{
todo.Title = CurrentDto.Title;
todo.Content = CurrentDto.Content;
}
}
IsIsRightDrawerOpens = false;
}
else//add
{
var addResult = await memoService.AddAsync(CurrentDto);
if (addResult.Status)
{
MemoDtos.Add(addResult.Result);
IsIsRightDrawerOpens = false;
}
}
}
catch (Exception)
{
throw;
}
finally { UpdateLoading(false); }
}
}
private void Query()
{
GetDataAsync();
}
private async void Selected(MemoDto obj)
{
try
{
UpdateLoading(true);
var memoResult = await memoService.GetFirstOfDefaultAsync(obj.Id);
if (memoResult.Status)
{
IsIsRightDrawerOpens = true;
CurrentDto = memoResult.Result;
}
}
catch (Exception)
{
throw;
}
finally
{
UpdateLoading(false);
}
}
private void Add()
{
CurrentDto = new MemoDto();
IsIsRightDrawerOpens = true;
}
public DelegateCommand AddCommand { get; private set; }
public DelegateCommand SelectedCommand { get; private set; }
public DelegateCommand ExecuteCommand { get; private set; }
private bool isIsRightDrawerOpens;
public bool IsIsRightDrawerOpens
{
get { return isIsRightDrawerOpens; }
set { isIsRightDrawerOpens = value; RaisePropertyChanged(); }
}
private ObservableCollection memoDtos;
public ObservableCollection MemoDtos
{
get { return memoDtos; }
set { memoDtos = value; RaisePropertyChanged(); }
}
private MemoDto currentDto;
///
/// 新增/编辑 选中数据
///
public MemoDto CurrentDto
{
get { return currentDto; }
set { currentDto = value; RaisePropertyChanged(); }
}
private string search;
///
/// 搜索条件
///
public string Search
{
get { return search; }
set { search = value; RaisePropertyChanged(); }
}
private async void GetDataAsync()
{
UpdateLoading(true);
var memoResult = await memoService.GetAllPageListAsync(new WPFProjectShared.Parameters.QueryParameter
{
PageIndex = 0,
PageSize = 100,
Search = Search
});
if (memoResult.Status)
{
memoDtos.Clear();
foreach (var item in memoResult.Result.Items)
{
memoDtos.Add(item);
}
}
UpdateLoading(false);
}
public override void OnNavigatedTo(NavigationContext navigationContext)
{
base.OnNavigatedTo(navigationContext);
GetDataAsync();
}
}
}