WPF实战学习笔记18-优化设计TodoView

这篇具有很好参考价值的文章主要介绍了WPF实战学习笔记18-优化设计TodoView。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

优化设计TodoView

修复新增项目无法编辑问题

更新MyToDo.Api/Service/ToDoService.cs

public async Task<ApiReponse> AddAsync(Todo model)
{
    try
    {
        var todo = mapper.Map<Todo>(model);
        await work.GetRepository<Todo>().InsertAsync(todo);
        if (await work.SaveChangesAsync() > 0)
            return new ApiReponse(true, todo);
        return new ApiReponse(false);
    }
    catch (Exception ex)
    {
        return new ApiReponse(false, ex);
    }
}

更新MyToDo.Api/Service/MemoService.cs

        public async Task<ApiReponse> AddAsync(Memo model)
        {
            try
            {
                var memo = mapper.Map<Memo>(model);
                await work.GetRepository<Memo>().InsertAsync(memo);
                if (await work.SaveChangesAsync() > 0)
                    return new ApiReponse(true, memo);
                return new ApiReponse(false);
            }
            catch (Exception ex)
            {
                return new ApiReponse(false, ex);
            }
        }

增加了对完成状态的区分

更新MyToDo.Api/Service/TodoView.xaml

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Border MinWidth="200" Margin="10">
            <Border.Style>
                <Style TargetType="Border">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Status}" Value="0">
                            <Setter Property="Background" Value="#1E90FF" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Status}" Value="1">
                            <Setter Property="Background" Value="#3CB371" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
            <Grid MinHeight="150">

增加了选项卡删除功能

更新删除请求URI

更新MyToDo.Api/Service/Baservice.cs

    public async Task<ApiResponse> DeleteAsync(int id)
    {
        BaseRequest request = new BaseRequest();

        request.Method = RestSharp.Method.DELETE;
        request.Route = $"api/{ServiceName}/Delete?todoid={id}";
        return await client.ExecuteAsync(request);

    }
添加删除命令并初始化

更新文件:MyToDo/ViewModel/TodoViewModel.cs

添加内容:

/// <summary>
/// 删除项
/// </summary>
public DelegateCommand<ToDoDto> DeleteCommand { get; set; }



/// <summary>
/// 删除指定项
/// </summary>
/// <param name="dto"></param>
async private void DeleteItem(ToDoDto dto)
{
    var delres = await service.DeleteAsync(dto.Id);

    if (delres.Status)
    {
        var model = TodoDtos.FirstOrDefault(t => t.Id.Equals(dto.Id));
        TodoDtos.Remove(dto);
    }
}  

更新内容

public TodoViewModel(ITodoService service,IContainerProvider provider) : base(provider)
{
    //初始化对象
    TodoDtos = new ObservableCollection<ToDoDto>();  
    RightContentTitle = "添加血雨待办";

    //初始化命令
    SelectedCommand         = new DelegateCommand<ToDoDto>(Selected);
    OpenRightContentCmd     = new DelegateCommand(Add);
    ExecuteCommand          = new DelegateCommand<string>(ExceuteCmd);
    DeleteCommand           = new DelegateCommand<ToDoDto>(DeleteItem);

    this.service = service;
}
UI添加删除按钮

更新文件:MyToDo/Views/TodoView.cs

更新内容:

<Grid MinHeight="150">
    <!--  给项目添加行为  -->
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonUp">
            <i:InvokeCommandAction Command="{Binding DataContext.SelectedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}" CommandParameter="{Binding}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <DockPanel Panel.ZIndex="2" LastChildFill="False">
        <TextBlock
                   Margin="10,10"
                   FontFamily="黑体"
                   FontSize="14"
                   Text="{Binding Title}" />
        <!--<md:PackIcon
                            Margin="10,10"
                            VerticalContentAlignment="Top"
                            DockPanel.Dock="Right"
                            Kind="More" />-->
        <md:PopupBox
                     Margin="5"
                     Panel.ZIndex="1"
                     DockPanel.Dock="Right">
            <Button
                    Panel.ZIndex="2"
                    Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}"
                    CommandParameter="{Binding}"
                    Content="删除" />
        </md:PopupBox>
    </DockPanel>
更改控制器

更新文件:MyToDo.Api/Controllers/TodoController.cs

更新内容:

public async Task<ApiReponse> Delete(int todoid)=> await service.DeleteAsync(todoid);

增加查询结果为空的图片

增加转换器

添加文件:MyToDo/Common/Converters/IntToVisibilityConveter.cs

更新内容:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows.Media;

namespace Mytodo.Common.Converters
{
    [ValueConversion(typeof(Color), typeof(Brush))]
    public class ColorToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is Color color)
            {
                return new SolidColorBrush(color);
            }
            return Binding.DoNothing;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is SolidColorBrush brush)
            {
                return brush.Color;
            }
            return default(Color);
        }
    }
}

修改UI
添加资源、命名空间

更新文件:MyToDo/Views/Converters/TodoView.xaml.cs

更新内容:

xmlns:cv="clr-namespace:Mytodo.Common.Converters"   

<UserControl.Resources>
    <ResourceDictionary>
        <cv:IntToVisibilityConveter x:Key="IntToVisility" />
    </ResourceDictionary>
</UserControl.Resources>
添加相关元素
FontSize="14" />
<StackPanel
            Grid.Row="1"
            VerticalAlignment="Center"
            Visibility="{Binding TodoDtos.Count, Converter={StaticResource IntToVisility}}">
    <Image
           Width="120"
           Height="120"
           Source="/Images/nores.jpg" />
    <TextBlock
               Margin="0,10"
               HorizontalAlignment="Center"
               FontSize="18"
               Text="尝试添加一些待办事项,以便在此处查看它们。" />
</StackPanel>
<ItemsControl

增加了根据状态查询的功能

Mytodo.Service/ITodoService增加GetAllFilterAsync接口
using Mytodo.Common.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyToDo.Share.Models;
using MyToDo.Share.Contact;
using MyToDo.Share.Parameters;
using MyToDo.Share;

namespace Mytodo.Service
{
    public interface ITodoService:IBaseService<ToDoDto>
    {
        Task<ApiResponse<PagedList<ToDoDto>>> GetAllFilterAsync(TodoParameter parameter);

    }
}
修改了控制器

MyToDo.Api.Controllers/TodoController

[HttpGet]
public async Task<ApiReponse> GetAll([FromQuery] TodoParameter param) => await service.GetAllAsync(param);
增加IToDoService接口

MyToDo.Api.Service/IToDoService

namespace MyToDo.Api.Service
{
    public interface IToDoService : IBaseService<Todo>
    {
        Task<ApiReponse> GetAllAsync(TodoParameter parameter);
    }
}

增加所需字段,属性,以及所需要的方法

更新文件:Mytodo.ViewModels/TodoViewModel.cs

/// <summary>
/// 项目状态
/// </summary>
public int SelectIndex
{
    get { return selectIndex; }
    set { selectIndex = value; RaisePropertyChanged(); }
}

private int selectIndex;

/// <summary>
/// 保存消息
/// </summary>
private async void Save()
{
    try
    {
        if (string.IsNullOrWhiteSpace(CurrDto.Title) || string.IsNullOrWhiteSpace(CurrDto.Content))
            return;

        UpdateLoding(true);

        if(CurrDto.Id>0) //编辑项
        {
            var updateres = await service.UpdateAsync(CurrDto);
            if (updateres.Status)
            {
                UpdateDataAsync();
            }
            else
            {
                MessageBox.Show("更新失败");

            }

        }
        else
        {       
            //添加项
            var add_res =   await service.AddAsync(CurrDto);
            //刷新
            if (add_res.Status) //如果添加成功
            {
                TodoDtos.Add(add_res.Result);
            }
            else
            {
                MessageBox.Show("添加失败");

            }

        }
    }
    catch
    {

    }
    finally
    {
        IsRightOpen = false;
        //卸载数据加载窗体
        UpdateLoding(false);
    }
}


/// <summary>
/// 打开待办事项弹窗
/// </summary>
void Add()
{
    CurrDto = new ToDoDto();
    IsRightOpen = true;
}

private void Query()
{
    GetDataAsync();
}



/// <summary>
/// 根据条件更新数据
/// </summary>
async void UpdateDataAsync()
{
    int? Status = SelectIndex == 0 ? null : SelectIndex == 2 ? 1 : 0;


    var todoResult = await service.GetAllFilterAsync(new MyToDo.Share.Parameters.TodoParameter { PageIndex = 0, PageSize = 100, Search = SearchString, Status = Status });

    if (todoResult.Status)
    {
        todoDtos.Clear();
        foreach (var item in todoResult.Result.Items)
            todoDtos.Add(item);
    }
}



/// <summary>
/// 获取所有数据
/// </summary>
async void GetDataAsync()
{
    //调用数据加载页面
    UpdateLoding(true);

    //更新数据
    UpdateDataAsync();

    //卸载数据加载页面
    UpdateLoding(false);
}

UI层增加绑定的界面
<ComboBox Margin="5" SelectedIndex="{Binding CurrDto.Status}">
    <ComboBoxItem Content="已完成" FontSize="12" />
    <ComboBoxItem Content="未完成" FontSize="12" />
</ComboBox>
<StackPanel
            Grid.Row="1"
            VerticalAlignment="Center"
            Visibility="{Binding TodoDtos.Count, Converter={StaticResource IntToVisility}}">
    <md:PackIcon
                 Width="120"
                 Height="120"
                 HorizontalAlignment="Center"
                 Kind="ClipboardText" />
    <TextBlock
               Margin="0,10"
               HorizontalAlignment="Center"
               FontSize="18"
               Text="尝试添加一些待办事项,以便在此处查看它们。" />
增加了IToDoService接口所对应的实现
public async Task<ApiReponse> GetAllAsync(QueryParameter parameter)
{
    try
    {
        var repository = work.GetRepository<Todo>();
        var todos = await repository.GetPagedListAsync(predicate:
                                                       x => string.IsNullOrWhiteSpace(parameter.Search) ? true : x.Title.Contains(parameter.Search),
                                                       pageIndex: parameter.PageIndex,
                                                       pageSize: parameter.PageSize,
                                                       orderBy: source => source.OrderByDescending(t => t.CreateDate));
        return new ApiReponse(true, todos);
    }
    catch (Exception ex)
    {
        return new ApiReponse(ex.Message,false);
    }
}

修复更新操作无法更新状态的bug

    public async Task<ApiReponse> UpdateAsync(Todo model)
    {
        try
        {
            var dbtodo = mapper.Map<Todo>(model);

            //获取数据
            var resposity = work.GetRepository<Todo>();
            //
            var todo = await resposity.GetFirstOrDefaultAsync(predicate: x => x.Id.Equals(dbtodo.Id));

            if(todo == null)
                return new ApiReponse("修改失败,数据库中无给定条件的数据项",false);

            todo.Title= dbtodo.Title;
            todo.UpdateDate=DateTime.Now;
            todo.CreateDate = dbtodo.CreateDate;
            todo.Content = dbtodo.Content;
            todo.Status = dbtodo.Status;

            resposity.Update(todo);

            if (await work.SaveChangesAsync() > 0)
                return new ApiReponse(true);
            return new ApiReponse(false);
        }
        catch (Exception ex)
        {

            return new ApiReponse(ex.Message, false);
        }
    }

修复当Search为空时查询失败的bug

Mytodo.Service/TodoService.cs文章来源地址https://www.toymoban.com/news/detail-606849.html

public async Task<ApiResponse<PagedList<ToDoDto>>> GetAllFilterAsync(TodoParameter parameter)
{
    BaseRequest request = new BaseRequest();

    request.Method = RestSharp.Method.GET;

    var parameter_search = parameter.Search;
    if(parameter_search==null)
    {
        request.Route = $"api/ToDo/GetAll?pageIndex={parameter.PageIndex}" +
            $"&pageSize={parameter.PageSize}" +
            $"&status={parameter.Status}";
    }
    else
        request.Route = $"api/ToDo/GetAll?pageIndex={parameter.PageIndex}" +
        $"&pageSize={parameter.PageSize}" +
        $"&search={parameter.Search}" +
        $"&status={parameter.Status}";


    return await client.ExecuteAsync<PagedList<ToDoDto>>(request);
}

到了这里,关于WPF实战学习笔记18-优化设计TodoView的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF实战学习笔记27-全局通知

    新建消息事件 添加文件:Mytodo.Common.Events.MessageModel.cs 注册、发送提示消息 UI增加Snackbar 修改文件:Mytodo.Views.MainView.xaml 注册消息 修改文件:Mytodo.Views.MainViewcs 构造函数添加 要注意的是,我们要发送的是文本,所以,this.skbar.MessageQueue.Enqueue函数内发送的是文本。 在需要的地

    2024年02月15日
    浏览(39)
  • WPF实战学习笔记26-首页导航

    修改UI,添加单击行为,并绑定导航命令 修改文件:Mytodo.Views.IndexView.xaml ,在导航梯形添加内容 添加导航命令,并初始化 修改文件:indexviewmodel.cs 添加导航区域变量,并初始化 修改文件:indexviewmodel.cs 添加导航方法 TaskBars添加对应的导航区域 修改OnNavigate方法 当为“已完成

    2024年02月15日
    浏览(35)
  • WPF实战学习笔记25-首页汇总

    注意:本实现与视频不一致。本实现中单独做了汇总接口,而视频中则合并到国todo接口当中了。 添加汇总webapi接口 添加汇总数据客户端接口 总数据客户端接口对接3 首页数据模型 添加数据汇总字段类 新建文件MyToDo.Share.Models.SummaryDto 添加汇总webapi接口 添加汇总接口 添加文

    2024年02月15日
    浏览(37)
  • WPF实战学习笔记23-首页添加功能

    实现ITodoService、IMemoService接口,并在构造函数中初始化。 新建 ObservableCollectionToDoDto 、 ObservableCollectionMemoDto 类型的属性,并将其绑定到UI中 修改Addtodo、Addmemo函数,将添加功能添加 添加添加函数 修改文件:Mytodo.ViewModels.IndexViewModel.cs

    2024年02月15日
    浏览(40)
  • WPF实战学习笔记08-创建数据库

    创建文件夹 ./Context 创建文件 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs ./Context/Todo.cs ./Context/User.cs 创建数据对象 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs 创建数据库DbSet ./Context/Todo.cs ./Context/User.cs 添加nuget包 Microsoft.EntityFrameworkCore.Design Shared design-time co

    2024年02月16日
    浏览(44)
  • WPF实战学习笔记06-设置待办事项界面

    创建待办待办事项集合并初始化 TodoViewModel: 创建绑定右侧命令、变量 设置界面

    2024年02月15日
    浏览(52)
  • WPF实战学习笔记13-创建注册登录接口

    添加文件 创建文件 + MyToDo.Api ​ ./Controllers/LoginController.cs ​ ./Service/ILoginService.cs ​ ./Service/LoginService.cs MyToDo.Share ./Dtos/UserDto.cs LoginController.cs ILoginService.cs LoginService.cs UserDto.cs 依赖注入 Program.cs 添加 AutoMapperProfilec.s 添加

    2024年02月15日
    浏览(39)
  • WPF实战学习笔记24-首页编辑与完成

    indexview添加Listbox控件的鼠标双击行为 添加todo、memo的编辑命令 indexviewmodel添加对应的更新事件处理 添加ToggleButton与后台的绑定 将ToggleButton的ischeck绑定到status属性 添加bool int 转换器 添加完成命令 添加完成功能函数 Listbox添加行为 给行为添加命令空间 文件:Mytodo.Views.IndexV

    2024年02月14日
    浏览(38)
  • WPF实战学习笔记30-登录、注册服务添加

    添加注册数据类型 添加注册UI 修改bug UserDto的UserName更改为可null类型 Resgiter 添加加密方法 修改控制器 添加注册数据类型 添加文件MyToDo.Share.Models.ResgiterUserDto.cs 添加注册UI 修改文件:Mytodo.Views.LoginView.xaml 添加注册、登录、退出等功能实现以及功能的字段 修改bug UserDto的User

    2024年02月14日
    浏览(34)
  • WPF实战学习笔记31-登录界面全局通知

    UI添加消息聚合器 注册提示消息 文件:Mytodo.Views.LoginView.cs构造函数添加内容 在需要的地方添加提示消息 修改文件:Mytodo.ViewModels.LoginViewModel.cs

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包