锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / WPF / MVVM模式下连接SQLServer
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。

MVVM模式下连接SQLServer


本文翻译自codeproject,看不懂codeproject,找锐英源。

本文比较基础,使用初学者学习。本文要点有:canExecute配合命令使用、connectionString、SqlConnection和MVVM简单介绍,有代码不明白的找锐英源软件。

 

介绍

在本文中,我想解释更多关于模型-视图-视图模型 (MVVM) 设计模式、为什么必须使用 MVVM 以及如何使用 MVVM 设计模式与 SQL Server 一起工作。

圆角矩形:查看

什么是 MVVM?

MVVM 模式包括三个关键部分:

  • Model (业务规则、数据访问、模型类)
  • View (用户界面 (XAML))
  • ViewModel (视图和模型之间的代理或中间人)

ViewModel 充当View 和 Model 之间的接口。它提供View和模型数据之间的数据绑定, 并使用命令处理所有 UI 操作。

将View 其控件值绑定到ViewModel属性,这反过来又会公开Model 对象中包含的数据。

为什么要使用 MVVM?

在传统的 UI 开发中 - 开发人员过去常常创建一个View,方式是使用窗口或用户控件或页面来创建,然后在后面代码中编写所有逻辑代码(事件处理、初始化和数据模型等),因此他们基本上是将代码作为视图定义类本身。这种方法增加了View 类,并在我的 UI 和数据绑定逻辑和业务操作之间创建了非常强的依赖关系。在这种情况下,没有两个开发人员可以同时在同一个视图上工作,而且一个开发人员的更改可能会破坏另一个代码。所以一切都在一个地方对于可维护性、可扩展性和可测试性来说总是一个坏主意。所以如果你看大局,你会感觉到所有这些问题都存在,因为以下几项之间存在非常紧密的耦合:

  • View (用户界面)
  • Model (UI中显示的数据)
  • 胶水代码(事件处理、绑定、业务逻辑)

在 MVVM 中,Glue 代码是 View Model。因此,它基本上侧重于关注点分离,以使应用程序结构的实现更易于创建和维护。

入门

步骤1

创建一个新类并添加以下代码以创建委托命令:

C#
public class DelegateCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;
public DelegateCommand(Action execute)
: this(execute, () => true)
{
_execute = execute;
}
public DelegateCommand(Action execute, Func<bool> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public void Execute(object parameter)
{
_execute();
}
public bool CanExecute(object parameter)
{
return _canExecute();
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}

ICommand 接口简介

命令为视图提供了一种机制来更新 MVVM 架构中的模型。命令提供了一种在元素树中搜索命令处理程序的方法。该ICommand接口在命名空间内定义System.Windows.Input。它有两个方法和一个事件。

C#
public bool CanExecute(object parameter)
public void Execute(object parameter)
public event EventHandler CanExecuteChanged

Execute 方法仅在CanExecute返回时调用true。如果CanExecute方法返回false,则绑定控件会自动禁用。

为了知道CanExecute值监听CanExecuteChanged事件,这可能会根据传递的参数而有所不同。

CanExecuteChanged 的​​任务

CanExecuteChanged通知绑定到的任何命令源(如 Button等)返回的值已更改。命令源关心这一点,因为它们通常需要相应地更新其状态(例如,如果返回, a将禁用自身)。CheckBoxICommandCanExecuteButtonCanExecute()false

CommandManager.RequerySuggested每当CommandManager认为某些事情发生了变化,会影响命令的执行能力时,就会引发该事件。这可能是焦点的改变。

C#
public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

第2步

创建一个新类并添加以下代码以创建一个ViewModel:

C#
public class CreateEmployeeViewModel : INotifyPropertyChanged
{
    private string _id;
    private string _firstName;
    private string _address;
    public CreateEmployeeViewModel()
    {
        SaveCommand = new DelegateCommand(Save, () => CanSave);
        
    }

    public string ID
    {
        get { return _id; }
        set
        {
            _id = value;
            NotifyOfPropertyChange("ID");
        }
     }
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            NotifyOfPropertyChange("FirstName");
        }
    }
    public string Address
    {
        get { return _address; }
        set
        {
            _address = value;
            NotifyOfPropertyChange("Address");
        }
    }
    public ICommand SaveCommand { get; private set; }
    
    public bool CanSave
    {
        get { return !string.IsNullOrEmpty(ID) && !string.IsNullOrEmpty(FirstName); }
    }
    string connectionString = 
      @"Data Source=RAVINDRA\MSSQLSERVERS;Initial Catalog=CrudMethod;Integrated Security=SSPI;";
    public void Save()
    {
       
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "INSERT INTO Users(ID,FirstName,Address)VALUES(@ID,@FirstName,@Address)";
        cmd.Parameters.AddWithValue("@ID", ID);
        cmd.Parameters.AddWithValue("@FirstName", FirstName);
        cmd.Parameters.AddWithValue("@Address", Address);
        try
        {
            con.Open();
            cmd.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        finally
        {
            con.Close();
        }
        MessageBox.Show("Data Saved Successfully.");
    }

INotifyPropertyChanged 接口介绍

该INotifyPropertyChanged接口用于通知客户端,通常绑定客户端属性值已更改。

例如,考虑一个Person 具有名为 的属性的对象FirstName。为了提供通用的属性更改通知,该Person类型实现了INotifyPropertyChanged接口并在更改时引发PropertyChanged事件FirstName。

要在绑定客户端和数据源之间的绑定中发生更改通知,您的绑定类型应该:

  • 实现INotifyPropertyChanged接口(首选)
  • 为绑定类型的每个属性提供一个更改事件

不要两者都做。

第 3 步

MainWindow.xaml.cs中,添加以下代码以初始化ViewModel 类并将其包装ViewModel 到View usingDataContext属性中。

C#
DataContext = new CreateEmployeeViewModel();

第4步

在MainWindow.xaml中添加以下代码:

XML
<Window x:Class="WpfTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Helloworld" Height="350" Width="525">
<Grid>
<Button x:Name="btnSave"
HorizontalAlignment="Left"
TabIndex="100"
Content="Save"
Width="100"
Height="30"
Margin="100,0,100,0"
Command="{Binding Path= SaveCommand}" />
<TextBox Height="23"
HorizontalAlignment="Left" Margin="114,26,0,0"
Name="txtID" VerticalAlignment="Top"
Width="120" Text="{Binding ID}"/>
<TextBox Height="23"
HorizontalAlignment="Left" Margin="114,55,0,0"
Name="txFirstName" VerticalAlignment="Top"
Width="120" Text="{Binding FirstName }" />
<TextBox Height="23"
HorizontalAlignment="Left" Margin="114,84,0,0"
Name="txtAddress" VerticalAlignment="Top"
Width="120" Text="{Binding Address}" />
<Label Content="ID:" Height="28"
HorizontalAlignment="Left"
Margin="84,26,0,0" Name="label1"
VerticalAlignment="Top" />
<Label Content="First Name:" Height="28"
HorizontalAlignment="Left"
Margin="40,50,0,0" Name="label2"
VerticalAlignment="Top" />
<Label Content="Address:" Height="28"
HorizontalAlignment="Left"
Margin="53,75,0,0" Name="label3"
VerticalAlignment="Top" />
</Grid>
</Window>

注意:请查看我们绑定到SaveCommand上的 Button Command 属性,当单击按钮时,此SaveCommand以ICommand形式进行通信。

 

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内