UWP開發之Mvvmlight實踐三:簡單MVVM實例開發(圖文詳解付代碼)

来源:http://www.cnblogs.com/lixiaobin/archive/2016/03/07/5252328.html
-Advertisement-
Play Games

自己編寫Mvvm模式代碼實現一個簡單的登陸畫面。涉及到了INotifyPropertyChanged的實現,ICommand的實現。最重要的還有Xbind


在做MVVM各種框架對比之前,我覺得有必要先自己做一個簡單的MVVM實現案例比較好,這樣就可以看到自己實現的時候有那些不方便的地方。而各種框架又是怎麼解決我們這些麻煩的。

1、創建UWP空項目

1

將False改成True,這應該都懂的

2

2、構建項目結構

4

3、創建Binding基類

7

代碼如下:

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace MvvmDemo.Common
{
    /// <summary>
    /// Viewmodel基類,屬性雙向綁定基礎
    /// </summary>
    public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// 屬性變更通知
        /// </summary>
        /// <param name="propertyName">屬性名</param>
        public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

 

4、創建Command基類

代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace MvvmDemo.Common
{
    public class DelegateCommand<T>: ICommand
    {
        /// <summary>
        /// 命令
        /// </summary>
        private Action<T> _Command;
        /// <summary>
        /// 命令可否執行判斷
        /// </summary>
        private Func<T, bool> _CanExecute;
        /// <summary>
        /// 可執行判斷結束後通知命令執行
        /// </summary>
        public event EventHandler CanExecuteChanged;

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="command">命令</param>
        public DelegateCommand(Action<T> command):this(command,null)
        {
        }

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="command">命令</param>
        /// <param name="canexecute">命令可執行判斷</param>
        public DelegateCommand(Action<T> command,Func<T,bool> canexecute)
        {
            if(command==null)
            {
                throw new ArgumentException("command");
            }
            _Command = command;
            _CanExecute = canexecute;
        }

        /// <summary>
        /// 命令執行判斷
        /// </summary>
        /// <param name="parameter">判斷數據</param>
        /// <returns>判定結果(True:可執行,False:不可執行)</returns>
        public bool CanExecute(object parameter)
        {
            return _CanExecute == null ? true : _CanExecute((T)parameter);
        }

        /// <summary>
        /// 執行命令
        /// </summary>
        /// <param name="parameter">參數</param>
        public void Execute(object parameter)
        {
            _Command((T)parameter);
        }
    }
}

5、創建ViewModel

代碼如下:

using MvvmDemo.Common;
using MvvmDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MvvmDemo.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        private string _userId;
        private string _userName;
        private DelegateCommand<string> _loginCommand;
        
        /// <summary>
        /// 用戶名
        /// </summary>
        public string UserId
        {
            get
            {
                return _userId;
            }

            set
            {
                _userId = value;
                NotifyPropertyChanged();
            }
        }
        /// <summary>
        /// 用戶名
        /// </summary>
        public string UserName
        {
            get
            {
                return _userName;
            }

            set
            {
                _userName = value;
                NotifyPropertyChanged();
            }
        }
        /// <summary>
        /// 登陸命令
        /// </summary>
        public DelegateCommand<string> LoginCommand
        {
            get
            {
                return _loginCommand
                    ??(_loginCommand=new DelegateCommand<string>(
                        s=>
                        {
                            UserName = new UserModel().GetUserName(s); 
                        },
                        s=>!string.IsNullOrEmpty(s)
                        ));
            }
        }
    }
}

6、創建View設置綁定

這裡直接就拿MainView做例子,更改下佈局

<Page
    x:Class="MvvmDemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MvvmDemo"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
          VerticalAlignment="Center"
          HorizontalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <TextBlock Text="用戶ID:" Grid.Row="0" Grid.Column="0" Width="100" />
        <TextBlock Text="用戶名:" Grid.Row="1" Grid.Column="0" Width="100" />
        <TextBox x:Name="txtUserID" Grid.Row="0" Grid.Column="1" Width="150" Text="{x:Bind VM.UserId,Mode=OneWay}" />
        <TextBlock x:Name="txbUserName" Grid.Row="1" Grid.Column="1" Width="150" Text="{x:Bind VM.UserName,Mode=OneWay}"  />
        <Button x:Name="btnLogin" Content="Login" Grid.Row="2" Grid.ColumnSpan="2" Width="150" HorizontalAlignment="Center"
                Command="{x:Bind VM.LoginCommand,Mode=OneWay}"
                CommandParameter="{Binding Text,ElementName=txtUserID,Mode=OneWay}"/>
    </Grid>
</Page>

後臺添加代碼

/// <summary>
    /// 可用於自身或導航至 Frame 內部的空白頁。
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainViewModel VM =>new MainViewModel();

        public MainPage()
        {
            this.InitializeComponent();
            this.DataContext = VM;    
        }
    }

 

7、創建Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MvvmDemo.Models
{
    public class UserModel
    {
        public string GetUserName(string userid)
        {
            return string.Format("取得成功:{0}",userid);
        }
    }
}

 

8、實行結果

輸入內容前按鈕自動不可用:

8

輸入內容後按鈕自動可用:

9

點擊Login按鈕:

10

9、總結

這種就是簡單的登陸實現,涉及到了MVVM的View,Viewmodel,Model。這裡按鈕是自動判斷是否可用,這個判斷實現就在我們的Viewmodel。例子中涉及到了Xbind,這個和Binding是有區別的,具體說明下節在續。可見自己實現Mvvm模式也不是很難的事情,不過隨著項目的複雜加深就會有很多問題,比如Viewmode之間通信等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天分享使用html+css3+少量jquery實現滑鼠移入移出圖片生成隨機動畫,我們先看最終效果圖(截圖為靜態效果,做出來可是動態的喲) 左右旋轉 上下移動 縮放 由於時間關係我就不一步步解析各段代碼所代表含義,我這裡就給出一些思路及關鍵 代碼: 1、首先使用ul li展現4張圖片 本示例中不僅使...
  • 出處:http://www.cnblogs.com/edisonfeng/p/3830224.html 一、服務端 1、主要結構: 2、主要代碼: 1)web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmln
  • 一、前言 我很喜歡電腦,可是筆記本還是太大,筆記本電腦再小還是要弄個小包背起來的,智能手機則不同,它完全就是一個手機,可以隨意裝在一個口袋裡隨身攜帶。因此我在2002年左右時最喜歡玩裝備是Dell的PDA,2007年的時候最喜歡玩的是N73,而在2010年最喜歡玩的則是Milestone。眼見著手機
  • Button btNext=(Button)findViewById(R.id.next); btNext.setOnClickListener(new Button.OnClickListener(){ public void onClick(View view){ //創建一個佈局管理器控制項 L
  • 服務 服務的生命周期 --- 1 開啟服務的生命周期 完整的生命周期:onCreate()-->onStartCommand()-->onDestroy() * 開啟服務:onCreate()-->onStartCommand() * 停止服務:onDestroy() * 特點: 1. 服務可以被多
  • · 代碼段。這個功能很早就知道了,Framework已經提供了很多代碼段,我們也可以自定義代碼段,不過之前一直沒有用過,今天實踐了一下,還是挺有意思的,這種代碼自動生成的思想其實挺有用的。另外發現一點,Framework中提供的代碼段中,關於C#和VB的數量明顯不一樣,不知道為啥C#要少呢?上網查了
  • 更新日線,是一項我們經常遇到的數據導入功能。 這項功能的說明文字,我是這麼寫的: 用戶在初次使用本系統的時候,需要安裝滬深兩市從開市到本年度的所有歷史數據,這些數據可以從某證券行情軟體獲得,是遵循一定格式的二進位文件。此後,每天兩市交易結束之後,用戶必須更新當天的日線行情,當然,用戶也可能在幾天後一
  • 這些東西是基礎中的基礎,基本上是本書都會講這個。但是很多東西到處都有,所以只撿了以下的這些寫下來。 關於類型的可見性和可訪問性 也就是public,internal這種東西,但是還是有個東西要提一下,那就是友元程式集。 利用System.Runtime.CompilerServices中的Inter
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...