---恢復內容開始---
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層低耦合的綁定起來,使開發程序更快,更便捷,有效。