WPF MVVM 學習總結(一)


---恢復內容開始---

1. MVVM簡介

  在WPF中,MVVM(View-ViewModel-Model)開發模型用的很多,它具有低耦合,可重用行,相對獨立的設計和邏輯。所以備受廣大開發者的喜愛。View 說白了就是前台界面,可以用HTML5,Asp.net等實現,ViewModel 是連接層(類似於MVC中的Controller),他將Model 層和View層結合起來,並封裝好命令,供View層綁定,Model層提供類的對象,供ViewModel可以輕松的訪問數據庫。

2. Demo簡介

   在VS中創建一個WPF的工程,在里面加入Commands,Models,ViewModels,Views文件名,Commands里面封裝了所有的操作命令的事件和委托,繼承於ICommand,分別實現了ICommand接口中的CanExecute() 方法和 Execute ()方法,第一個方法返回bool 類型,所有后面增加,刪除,IsExist 這種動作的操作都可綁定此方法,第二個方法返回空,就是執行所有的操作。還有一個委托CanExecuteChanged,當出現影響是否應執行該命令的更改時發生。

代碼如下:  

namespace MVVMTest.Commands
{
     class DelegateCommand : ICommand
      {
             public Func<object, bool> CanExecuteFunc { get; set; }

             public Action<object> ExcuteAction { get; set; }

             public event EventHandler CanExecuteChanged;

            public bool CanExecute(object parameter)
           {
              if (CanExecuteFunc == null)
              {
                 return true;
              }
              return CanExecuteFunc(parameter);
           }

         public void Execute(object parameter)
         {
            if (ExcuteAction == null)
             return;
              ExcuteAction(parameter);
          }
     }
}

  在ViewModel中增加一個類,這個類用來連接View和Model層,這個層把View層里面的時間綁定到ViewModel中的方法中,並且通過Model去處理操作過程。在ViewModel中這一層相當於MVC中的Controller層,和三層架構中的業務邏輯層處理的功能類似。

代碼如下:

namespace MVVMTest.ViewModels
{
    class UrlViewModel : NotificationObject
    {
        public DelegateCommand UrlCommand { get; set; }

        private Window window;

        private void Url(object parameters)
        {
            window.Show();
        }

        public UrlViewModel(Window window)
        {
            this.window = window;
            UrlCommand = new DelegateCommand();
            UrlCommand.ExcuteAction = new Action<object>(Url);
        }
    }
}

上圖代碼 實現的功能是綁定所有跳轉按鈕的事件,當任何一個頁面需要跳轉的時候,都可以用這個ViewModel 類中的方法實現,這樣就實現了同一類方法的重復調用,即MVVM中的可重用性,任何一個View 都可以使用這個ViewModel中的命令,如果View層動了,ViewModel層並不需要改動,體現了MVVM中的低耦合性。

 View層中是所有的用戶界面顯示層,View 層可以用Asp.net, HTML5,JavaScript實現。

代碼如下:

<Button Name="button1"
Width="178"
Height="35"
Margin="45,179,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Command="{Binding UrlCommand}"
Content="Add" />

  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MVVMTest.ViewModels;

namespace MVVMTest
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
             this.DataContext = new UrlViewModel(new MainWindow());
        }

    }
}

這樣 運行起來之后 當點擊 Login 登錄頁面里面的Button 的時候,就可以跳轉到 MainPage里面了。

 在Model 層中,主要用來存放一些 實體對象,如User,Product,Goods這些對象,這些對象主要用來幫助ViewModel層中的命令去訪問數據庫層,或者做一些簡單的處理。

    public class User
    {
        public string ID { get; set; }
        public string Name { get; set; }
    }

  

3. 總結

   MVVM 中更好了實現了面向對象中的繼承和封裝,所有的命令都繼承自ICommand接口,他將所有的命令用ViewModel層去實現,將View層和Model層低耦合的綁定起來,使開發程序更快,更便捷,有效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM