MVVM模式下连接SQLServer

#程序员##IT教育##IT##.net##MVVM的优势#

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


本文翻译自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 _canExecute;
    public DelegateCommand(Action execute)
        : this(execute, () => true)
    {
        _execute = execute;
    }
    public DelegateCommand(Action execute, Func 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

   
    
        

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

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章