首页 > 数据库 >WPF+SqlSugar+MVVM实现增删改查

WPF+SqlSugar+MVVM实现增删改查

时间:2023-12-23 15:46:01浏览次数:33  
标签:SelectUser Users MVVM 改查 ID new WPF null public

1、新建一个WPF应用(NET Framework)

2、安装SqlSugar NuGet包

3、在SqlSugar4.x下载代码生成器https://www.donet5.com/Doc/8/1137

4、在WPF中新建三个文件夹 Models 主要放实体类、Views 主要放窗体、ViewModels 主要是View逻辑的实现

5、把生成的实体类放到Models文件夹内,在ViewModels 新建一个类DelegateCommands.cs
public class DelegateCommands : ICommand
{
//当命令可执行状态发生改变时,应当被激发
public event EventHandler CanExecuteChanged;

    public Action<object> ExecuteCommand = null;

    public Func<object, bool> CanExecuteCommand = null;
    /// <summary>
    /// 用于判断命令是否可以执行
    /// </summary>
    /// <param name="parameter"></param>
    /// <returns></returns>
    public bool CanExecute(object parameter)
    {
        if (CanExecuteCommand !=null)
        {
            return CanExecuteCommand(parameter);
        }
        else
        {
            return true;
        }
    }
    /// <summary>
    /// 命令执行
    /// </summary>
    /// <param name="parameter"></param>
    public void Execute(object parameter)
    {
        if (ExecuteCommand !=null)
        {
            ExecuteCommand(parameter);
        }
    }

6、ViewModel新建UserViewModel.cs
public class UserViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string PropertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
}

    SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
    {
        //数据库配置
        ConnectionString = "Data Source=.;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=123456",

        DbType = DbType.SqlServer,//设置数据库类型

        IsAutoCloseConnection = true,//自动释放数据务,如果存在事务,在事务结束后释放

        InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息

    });


    private ObservableCollection<Users> userList;
    /// <summary>
    /// 用户集合
    /// </summary>
    public ObservableCollection<Users> UserList
    {
        get
        {
            if (userList == null)
            {
                userList = new ObservableCollection<Users>();
                //设置数据源 //也可以直接写查询
                userList = new ShowDataViewModel().GetUsers();
            }
            return userList;               
        }
        set {
            if (userList == null)
            {
                userList = new ObservableCollection<Users>();
            }
            userList = value;
            OnPropertyChanged("UserList");
        }
    }
    public Users selectUser;
    /// <summary>
    /// 被选中的用户
    /// </summary>
    public Users SelectUser
    {
        get
        {
            if (selectUser == null)
            {
                selectUser = new Users();

            }
            return selectUser;
        }
        set
        {
            if (selectUser == null)
            {
                selectUser = new Users();
            }
            selectUser = value; OnPropertyChanged("SelectUser");
        }
    }
    /// <summary>
    /// 注册命令
    /// </summary>
    private void RegisterCommands()
    {
        AddCommand = new DelegateCommands();
        AddCommand.ExecuteCommand = new Action<object>(AddUser);
        UpdateCommand = new DelegateCommands();
        UpdateCommand.ExecuteCommand = new Action<object>(UpdateUser);
        DeleteCommand = new DelegateCommands();
        DeleteCommand.ExecuteCommand = new Action<object>(DeleteUser);
        SelectionCommand = new DelegateCommands();
        SelectionCommand.ExecuteCommand = new Action<object>(SelectionUser);
    }
    public UserViewModel()
    {
        RegisterCommands();
    }
    /// <summary>
    /// 显示提示信息
    /// </summary>
    /// <param name="txt"></param>
    public void MsgShow(string txt)
    {
        System.Windows.MessageBox.Show(txt);
        //删除后清空选择用户
        SelectUser = null;
    }
    #region 注册命令
    /// <summary>
    /// 新增用户
    /// </summary>
    public DelegateCommands AddCommand { get; set; }
    /// <summary>
    /// 更新用户
    /// </summary>
    public DelegateCommands UpdateCommand { get; set; }
    /// <summary>
    /// 删除用户
    /// </summary>
    public DelegateCommands DeleteCommand { get; set; }
    /// <summary>
    /// 选择用户
    /// </summary>
    public DelegateCommands SelectionCommand { get; set; }
    public void AddUser(object parameter)
    {
        Users us = new Users();
        us.U_Name = SelectUser.U_Name;
        us.U_Age = SelectUser.U_Age;
        us.U_Sex = SelectUser.U_Sex;
        us.U_Tel = SelectUser.U_Tel;
        us.U_Pwd = "123";
        us.D_ID = 1;
        var t3 = db.Insertable(us).ExecuteReturnEntity();
        MsgShow("用户编号:" + t3.U_ID + "\n新增成功!");
        UserList = new ShowDataViewModel().GetUsers();
    }
    public void UpdateUser(object parameter)
    {
        if (SelectUser.U_ID < 1)
        {
            MsgShow("请选择修改项!");
            return;
        }
        //查找需要修改的对象
        Users user = UserList.Where(a => a.U_ID == SelectUser.U_ID).SingleOrDefault();
        //查找需要修改的对象索引
        int index = UserList.IndexOf(user);
        //使数据的复制变为深复制,需要实现ICloneable接口
        var t1 = db.Updateable((Users)SelectUser.Clone()).ExecuteCommand(); //这种方式会以主键为条件
        MsgShow("用户编号:" + SelectUser.U_ID + "\n修改成功!");
        UserList = new ShowDataViewModel().GetUsers();
    }
    public void DeleteUser(object parameter)
    {
        if (SelectUser.U_ID < 1)
        {
            MsgShow("请选择修改项!");
            return;
        }
        Users user = UserList.Where(a => a.U_ID == SelectUser.U_ID).SingleOrDefault();
        var t0 = db.Deleteable<Users>().Where(u => u.U_ID == user.U_ID).ExecuteCommand();
        MsgShow("用户编号:" + SelectUser.U_ID + "\n删除成功!");
        UserList = new ShowDataViewModel().GetUsers();

    }
    public void SelectionUser(object parameter)
    {
        DataGrid grid = (DataGrid)parameter;
        //使数据的复制变为深复制,需要实现ICloneable接口
        if (grid.SelectedItem!=null)
        {
            SelectUser = (Users)((Users)grid.SelectedItem).Clone();
        }           
    }
    #endregion
}

7、View新建窗体

点击查看代码
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="5*"/>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="1.5*"/>
        </Grid.RowDefinitions>
        <DataGrid x:Name="dgUser" IsReadOnly="True" AutoGenerateColumns="False" CanUserAddRows="False" HorizontalAlignment="Left" ItemsSource="{Binding UserList}" Width="444">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged" >
                    <i:InvokeCommandAction Command="{Binding SelectionCommand}" CommandParameter="{Binding ElementName=dgUser}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding U_ID}" Header="编号"/>
                <DataGridTextColumn Binding="{Binding U_Name}" Header="姓名" Width="100"/>
                <DataGridTextColumn Binding="{Binding U_Age}" Header="年龄"/>
                <DataGridTextColumn Binding="{Binding U_Sex}" Header="性别" Width="60"/>
                <DataGridTextColumn Binding="{Binding U_Tel}" Header="电话" Width="172"/>
            </DataGrid.Columns>
        </DataGrid>
        <GroupBox Header="用户基本信息" Grid.Row="1">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <StackPanel Grid.Column="0" Grid.Row="0" Orientation="Horizontal">
                    <Label x:Name="lblID" Content="编号:" VerticalAlignment="Center" />
                    <TextBox x:Name="tbxID" IsEnabled ="False"  Text="{Binding SelectUser.U_ID}" VerticalAlignment="Center" MaxLength="5" Height="22"  Width="90"/>
                </StackPanel>
                <StackPanel Grid.Column="1" Grid.Row="0" Orientation="Horizontal">
                    <Label x:Name="lblName"  Content="姓名:" VerticalAlignment="Center" />
                    <TextBox x:Name="tbxName" Text="{Binding SelectUser.U_Name}" VerticalAlignment="Center" Height="22" MaxLength="6" Width="90"/>
                </StackPanel>
                <StackPanel Grid.Column="2" Grid.Row="0" Orientation="Horizontal">
                    <Label x:Name="lblAge" Content="年龄:" VerticalAlignment="Center" />
                    <TextBox x:Name="tbxAge" Text="{Binding SelectUser.U_Age}" VerticalAlignment="Center" Height="22" MaxLength="4" Width="90"/>
                </StackPanel>
                <StackPanel Grid.Column="0" Grid.Row="1" Orientation="Horizontal">
                    <Label x:Name="lblSex" Content="性别:" VerticalAlignment="Center"/>
                    <ComboBox Text="{Binding SelectUser.U_Sex}"  SelectedIndex="0" x:Name="cbxSex" VerticalAlignment="Center"  Width="90">
                        <ComboBoxItem Tag="1" Content="男"/>
                        <ComboBoxItem Tag="2" Content="女"/>
                    </ComboBox>
                </StackPanel>
                <StackPanel  Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2" Orientation="Horizontal">
                    <Label x:Name="lblRemarks" Content="电话:" VerticalAlignment="Center"/>
                    <TextBox x:Name="tbxRemarks" Text="{Binding SelectUser.U_Tel}" VerticalAlignment="Center" Height="22" Width="235" />
                </StackPanel>
            </Grid>
        </GroupBox>
        <GroupBox Header="功能操作" Grid.Row="2">
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Button x:Name="btnSave" Command="{Binding AddCommand}" Content="新增" VerticalAlignment="Center"  Width="69" Height="19" Margin="10,0,10,0" />
                <Button x:Name="btnUpdate" Command="{Binding UpdateCommand}" Content="修改" VerticalAlignment="Center" Width="69" Height="19" Margin="10,0,10,0"/>
                <Button x:Name="btnDelete" Command="{Binding DeleteCommand}" Content="删除" VerticalAlignment="Center" Width="69" Height="19" Margin="10,0,10,0"/>
            </StackPanel>
        </GroupBox>
    </Grid>

ps:下载地址:链接:https://pan.baidu.com/s/1NPNw8gYUeNxzV93ln9xuXQ?pwd=4m28
提取码:4m28

标签:SelectUser,Users,MVVM,改查,ID,new,WPF,null,public
From: https://www.cnblogs.com/liuzi12138/p/17923165.html

相关文章

  • 浅谈WPF之DataGrid过滤,分组,排序
    使用过Excel的用户都知道,Excel可以方便的对数据进行分组,过滤,排序等操作,而在WPF中,默认提供的DataGrid只有很简单的功能,那么如何才能让我们开发的DataGrid,也像Excel一样具备丰富的客户端操作呢?今天就以一个简单的小例子,简述如何在WPF中实现DataGrid的过滤,筛选,排序等功能。仅供学习分......
  • wpf + LiveCharts.wpf 做个漂亮的图表
    十年河东,十年河西,莫欺少年穷学无止境,精益求精参考:WPFLiveChart图表详解接着上一篇博客: wpf+MaterialDesign+Prism8实现导航功能 1、项目引入图表包 2、定义用户控件IndexView的IndexViewModel,如下usingLiveCharts;usingPrism.Mvvm;usingSystem;using......
  • wpf + MaterialDesign + Prism8 实现导航功能
    十年河东,十年河西,莫欺少年穷学无止境,精益求精实现的效果: 1、初始化Prism 1.1、项目引入如下包 1.2、按照Prism规则,项目中创建如下文件夹 Prism规则:必须将窗体放入Views文件夹中,窗体名称必须以View结尾,必须将数据上下文放入ViewModels文件夹中,上下文类必须以Model结......
  • CommunityToolkit.Mvvm 之 通过一个属性控制一个按钮是否禁用 及 按钮执行费时需任务
    要达到的目的:通过一个属性控制一个按钮是否禁用当按钮执行费时需任务时,按下禁用按钮,任务完成后自动解除禁用1. 属性定义1[ObservableProperty]2[NotifyCanExecuteChangedFor(nameof(SettingParamCommand))]//属性变化时通知对应的命令3privateboolallowOperator;2.......
  • WPF中通过附加属性实现任意控件拖动调整大小
    publicclassResizeBehavior{//附加属性用于标识控件是否可调整大小publicstaticreadonlyDependencyPropertyIsResizableProperty=DependencyProperty.RegisterAttached("IsResizable",typeof(bool),typeof(ResizeBehavior),newP......
  • wpf 元素设置焦点无效的问题
    首先确定元素的Enabled, Visible, Loaded,and Focusable这四个属性,如果这些属性的任何一个为false,则不能设置焦点到该元素上。如果Focusable为false,设置焦点的方式可以先在鼠标左键按下事件中,设置Focusable,如下:userControl.MouseLeftButtonDown+=delegate{userCo......
  • WPF自定义控件之图形解锁控件 ScreenUnLock
    ScreenUnLock与智能手机上的图案解锁功能一样。通过绘制图形达到解锁或记忆图形的目的。本人突发奇想,把手机上的图形解锁功能移植到WPF中。也应用到了公司的项目中。在创建ScreenUnLock之前,先来分析一下图形解锁的实现思路。1.创建九宫格原点(或更多格子),每个点定义一个坐标值......
  • .NET Core 3 WPF MVVM框架 Prism系列之导航系统
    本文将介绍如何在.NETCore3环境下使用MVVM框架Prism基于区域Region的导航系统git在讲解Prism导航系统以前,咱们先来看看一个例子,我在以前的demo项目建立一个登陆界面:github 咱们看到这里是否是一开始想象到使用WPF带有的导航系统,经过Frame和Page进行页面跳转,而后经过导航日志......
  • 【WPF】 BasedOn的用法
    BasedOn用于样式的继承。这里的已经继承了一个样式  此时,我们想在Resource中让他附加新的样式,但是这样不成功  修改如下:去掉了之前的样式选择  我们使用BasedOn让其叠加样式 ......
  • 【C#/WPF】Bitmap、BitmapImage、ImageSource 、byte[]转换问题
    C#/WPF项目中,用到图像相关的功能时,涉及到多种图像数据类型的相互转换问题,这里做了个整理。包含的内容如下:Bitmap和BitmapImage相互转换。RenderTargetBitmap–>BitmapImageImageSource–>BitmapBitmapImage和byte[]相互转换。byte[]–>BitmapStackOverflow上有很......