首页 > 其他分享 >循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码

循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码

时间:2023-10-23 12:34:08浏览次数:30  
标签:代码生成 CommunityToolkit 界面 代码 视图 列表 WPF 生成

1、代码生成工具Database2Sharp生成WPF界面代码

WPF应用端的基础接口,和Winform端、Vue3+ElementPlus前端一样,都是调用SqlSugar开发框架中的相关业务接口,如果对我们的SqlSugar框架还有疑问,可以参考我的随笔集《SqlSugar开发框架》进行系列的学习或了解。

要了解项目的快速生成,需要从我们官网下载《代码生成工具Database2Sharp》工具后进行使用,该工具支持多种框架的项目开发,我们这里以SqlSugar开发框架中的【SqlSugar框架WPF界面生成】的项目生成为例介绍。

我们首先需要使用PowerDesigner或者同类工具进行表的建模,如下所示。

创建好相关的客户信息表后,先展开数据库列表,并从数据库列表右键选择对应的【SqlSugar框架WPF界面生成】或者在工具栏中快速选择操作,如下界面所示。

或者从工具栏中选择对应的功能入口。

在弹出的对话框中选择对应的表进行框架代码和【WPF界面生成】,从数据库列表中选择表进行测试生成,如下界面所示。

我们可以从上面的列表中,定义查询条件、列表显示的内容,以及编辑界面所需要编辑显示的内容等信息。然后一键生成即可生成相应的WPF应用端的视图模型,以及视图界面和后台代码。

我们以简单的T_Customer表为例,展示生成的界面代码,生成后,会在目录中创建ViewModels和Views/Pages目录,其中包含视图模型和视图界面代码及后台代码。

视图模型包含列表的视图模型和编辑界面的视图模型,如下两个文件所示。

列表视图的模型代码如下所示(包含一些例子代码)。

/// <summary>
/// 客户信息 列表-视图模型对象
/// </summary>
public partial class CustomerListViewModel : BaseListViewModel<CustomerInfo, string, CustomerPagedDto>
{
    /// <summary>
    /// 树列表的模型
    /// </summary>
    [ObservableProperty]
    private TreeViewModel<CustomTreeNode> treeModel = new();

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="service">业务服务接口</param>
    public CustomerListViewModel(ICustomerService service) : base(service)
    {
        //设置导出的字段列表
        this.ExportFields = "Name,Age,Creator,CreateTime";
    }

    /// <summary>
    /// 触发处理命令,处理树列表
    /// </summary>
    [RelayCommand]
    private async Task GetTree()
    {
        //下面代码仅为示例,具体根据实际情况处理
        /*
        //获取嵌套列表
        var allNode = await BLLFactory<IFunctionService>.Instance.GetTree(App.ViewModel.SystemType);
        //根据列表递归删除对应节点列表
        var treeeNodeList = AddRecursive(allNode);

        this.TreeModel.TreeItems = treeeNodeList;
        this.TreeModel.FilteredTreeItems = new List<CustomTreeNode>(treeeNodeList);

        //提示更新界面控件数据源
        this.NotifyChanged(nameof(this.TreeModel));
        */
    }

    /// <summary>
    /// 嵌套添加列表
    /// </summary>
    /// <param name="children">嵌套集合列表</param>
    /// <param name="parentNode">父节点,可为空</param>
    /// <returns></returns>
    private List<CustomTreeNode> AddRecursive(List<FunctionNodeInfo> children, CustomTreeNode parentNode = null)
    {
        var treeeNodeList = new List<CustomTreeNode>();
        foreach (var info in children)
        {
            var node = new CustomTreeNode
            {
                Name = info.Name,
                Id = info.Id
            };
            AddRecursive(info.Children, node);

            treeeNodeList.Add(node);
        }

        if (parentNode != null)
        {
            parentNode.Children = treeeNodeList;
            return new List<CustomTreeNode>() { parentNode };
        }
        else
        {
            return treeeNodeList;
        }
    }
}

编辑界面的视图模型代码如下所示。

    /// <summary>
    /// 客户信息 新增、编辑-视图模型
    /// </summary>
    public partial class CustomerEditViewModel : BaseEditViewModel<CustomerInfo, string, CustomerPagedDto>
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="service">服务接口对象</param>
        public CustomerEditViewModel(ICustomerService service) : base(service)
        {
            this.Title = "客户信息";
        }

        /// <summary>
        /// 刷新记录相关的信息
        /// </summary>
        /// <returns></returns>
        public async Task InitData(string id)
        {
            //实现代码

            //所辖公司
            //if(!this.Item.Company_ID.IsNullOrEmpty())
            //{
            //    this.SelectedCompanyItem = this.CompanyItems.First(s => s.Id.ToString() == this.Item.Company_ID);
            //}
        }
    }

由于继承了相关的基类信息,我们基本上有这些操作就可以完成常规的CRUD以及树形列表的展示处理了,如果需要更多的操作,可以扩展相关的代码,同样界面代码和界面后台代码配套,统一生成相关的查询、列表、分页、导入导入、编辑显示等处理效果。生成的列表界面、编辑界面及其对应的界面后端代码,一共四个文件即可。

 由于代码不少,就不再一一展示。

调整界面的高度和宽度基本上就可以了。

常规的列表界面,包含查询、列表展示、分页(超过一页则显示)、导入导出、删除、编辑查看等相关功能了。

对比Winform的生成界面效果,也是很类似的。

WPF应用端中,编辑和新建界面统一,双击列表或者单击按钮【编辑】【新增】弹出模态对话框界面,如下界面所示。

以上就是最简单的表的界面生成,其他界面,可能会包含一些下拉列表,特殊输入等,我们根据前面随笔介绍的自定义控件操作,增加一些特殊的输入或者显示即可。

这些代码我们会注释在生成的界面代码上,供参考使用。

<!--参考控件代码-->
<!--
    <hc:ComboBox
        ItemsSource="{Binding Path=GenderItems, Source={StaticResource DictItemsModel}}"
        Margin="5"
        hc:TitleElement.Title="性别"
        hc:TitleElement.TitlePlacement="Left"
        DisplayMemberPath="Text"
        SelectedValue="{Binding ViewModel.PageDto.Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
        SelectedValuePath="Value"
        ShowClearButton="True" />
     <Controls:NumericRange
        EndValue="{Binding ViewModel.PageDto.AgeEnd, UpdateSourceTrigger=PropertyChanged}"
        StartValue="{Binding ViewModel.PageDto.AgeStart, UpdateSourceTrigger=PropertyChanged}"
        Text="年龄"
        ValueChangedCommand="{Binding SearchCommand}" />
    <control:ComboBox
        DictTypeName="客户类型"
        Width="250"
        Height="32"
        VerticalAlignment="Center"
        hc:InfoElement.Title="客户类型"
        hc:InfoElement.TitlePlacement="Left"
        SelectedValue="{Binding ViewModel.PageDto.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
        ShowClearButton="True"
        Style="{StaticResource ComboBoxPlusBaseStyle}" />
    <control:CheckComboBox
        DictTypeName="客户类型"
        Width="500"
        Height="32"
        VerticalAlignment="Center"
        hc:InfoElement.Title="客户类型"
        hc:InfoElement.TitlePlacement="Left"
        SelectedValue="{Binding ViewModel.PageDto.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
        SelectedValuePath="Value"
        ShowClearButton="True"
        ShowSelectAllButton="True"
        Style="{StaticResource CheckComboBoxPlus}" />                                        
-->

 

2、合并界面代码并添加菜单到系统中使用

上面我们介绍生成的界面代码,整合到项目后的具体效果,我们看看如何整合到已有的WPF应用端项目上。

前面生成的文件(包括视图模型和视图界面代码),和你项目的命名空间保持一致,然后复制到项目上进行增量式的合并即可。

合并的具体位置根据实际情况放置即可,如视图模型放到视图模型的大目录上,界面代码放到视图目录上即可,如下界面所示。

编译上面的合并代码,如果顺利编译后,我们还需要添加相应的系统功能菜单到系统上,才能进行分配使用。

其中WPF窗体类型,就是我们窗体的命名空间+列表界面类名称,如:WHC.SugarProject.WpfUI.Views.Pages.CustomerListPage。

分配完成后,系统用户重新登录,就可以看到相应增加的菜单功能入口了,单击菜单就可以打开Page列表页面,如果需要新增,则会弹出对话框进行输入。

如果是需要直接编辑DataGrid表格的数据的操作,可以参考随笔《循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(10) -- 在DataGrid上直接编辑保存数据》。

我们通过这样通过一个简单的表的信息,演示了如何使用代码生成工具Database2Sharp生成WPF界面代码,并整合到WPF应用端项目上进行使用,实现菜单的动态化访问。 

 

标签:代码生成,CommunityToolkit,界面,代码,视图,列表,WPF,生成
From: https://www.cnblogs.com/wuhuacong/p/17782015.html

相关文章

  • WPF 已知问题 RadioButton 指定 GroupName 后关闭窗口可能导致无法选中
    本文记录一个WPF已知问题,当WPF的RadioButton指定GroupName且将IsChecked状态绑定到ViewModel上,将包含以上控件的代码的窗口显示两个,接着关闭其中一个。此时可以看到依然开着的窗口的RadioButton控件无法正确在用户界面上点击选中此问题已经报告给WPF官方,请看htt......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉
    在我们开发的前端项目中,往往为了方便,都需对一些控件进行自定义的处理,以便实现快速的数据绑定以及便捷的使用,本篇随笔介绍通过抽取常见字典列表,实现通用的字典类型绑定;以及通过自定义控件的属性处理,实现系统字典内容的快捷绑定的操作。1、下拉列表的数据绑定在我们创建下拉列表的......
  • WPF中资源URL解读
    引言资源(Resources)在WPF(WindowsPresentationFoundation)中扮演着非常重要的角色,它们提供了一种灵活和高效的方式来管理和使用图像、样式、模板等。资源URL(ResourceURL)则是资源管理中的一个关键概念。本文将深入解读WPF中资源URL的概念,类型,以及如何高效地使用它们。1.资源与......
  • WPF触发器(Triggers):介绍与用法实例
    引言WindowsPresentationFoundation(WPF)提供了一个丰富和灵活的图形渲染框架,触发器(Triggers)是其中一个重要的功能。触发器能够用来控制或改变UI元素的属性、样式、甚至行为。在这篇博客文章中,我们将详细介绍WPF中触发器的种类、用法,并通过一些实际例子进行讲解。1.触发器的种......
  • MybatisX-Generator自动代码生成插件使用
    使用步骤:1、安装MybatisX插件;2、idea的database连接数据库;3、数据库表上右键,点击MybatisX-Generator;4、 进行生成代码的配置,按自己的项目项目修改如图三个位置的路径,配置完成后点击Next 5、本人项目是Mybatis-plus项目,如图的配置是针对Mybatis-plus......
  • WPF和WinForm的区别是什么
    wpf和winform的区别:1、WPF是微软推出取代winform的产品,能分离界面设计人员与开发人员,而WinForm创建丰富的基于Windows的应用程序;2、WPF底层使用的DirectX,winform底层使用的是GDI+。WPF,即windowspresentationfoundation,windows呈现基础,属于.netframework3.0,是微软推出取......
  • WinForm与WPF的异同
    WinForm和WPF都是微软推出的桌面应用程序开发框架,很多人不知道该如何选择,今天我们一起来盘点下两者的异同点。01设计理念不同WinForm是2001年推出的界面应用开发框架,采用的是窗体和控件模型,以事件驱动的开发模式,并且提供了丰富控件库,方便开发者开发应用程序。WPF是2006年推出......
  • DevExpress WPF Pivot Grid组件,可轻松实现多维数据分析!(二)
    在上文中(点击这里回顾>>)我们主要为大家介绍了DevExpressWPF PivotGrid组件的超快速枢轴分析功能、Microsoft分析服务等,本文将继续介绍图表透视数据的处理、MVVM支持等。欢迎持续关注我们,探索更多新功能哦~P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需......
  • WPF TextBox按回车键执行
    如果界面上只有一个要执行的命令时,可以直接把某个Button的IsDefault设置为True就可以。如果界面上有多个不同的执行命令的话,可以用下面的InputBindings,不同的输入框绑定不同的Command即可。<TextBoxText="{BindingProgressName,UpdateSourceTrigger=PropertyChanged}"S......
  • WPF绘图(二):绘制图形
    WPF绘制图形有三种方式:使用FrameworkElement的派生类使用图元转换器绘制几何图形使用DrawingContext绘制1. 使用FrameworkElement派生类FrameworkElement类继承自UIElement类,意味它的派生类,都是UI元素,可以直接显示在界面上中。例如Shape的子类,Control的子类等。这是最简单......