1. 程式人生 > >WPF的MVVM開發模式 與 databinding 和commandbinding

WPF的MVVM開發模式 與 databinding 和commandbinding

既然講到MVVM模式,自然第一個問題就是MVVM的含義。MVVM是Model-View-ViewModel的縮寫形式,它通常被用於WPF或Silverlight開發。

模型(Model)

  Model——可以理解為帶有欄位,屬性的類。

檢視(View)

  View——可以理解為我們所看到的UI。

檢視模型(View Model)

View Model在View和Model之間,起到連線的作用,並且使得View和Model層分離。View Model不僅僅是Model的包裝,它還包含了程式邏輯,以及Model擴充套件,例如,如果Model中有一個公開屬性不需要在UI上顯示,此時我們可以不再View Model中去定義它。

MVVM的例子

<Window.DataContext>
        <vm:ViewModel1></vm:ViewModel1>
    </Window.DataContext>
    <Grid Background="{Binding BgColor,Mode=TwoWay}"  >
        <Button x:Name="c" Height="20" Width="30"  Command="{Binding ChangeBg}" >
        </Button>
    </Grid>

public readonly static DependencyProperty BgColorProperty = DependencyProperty.Register("BgColor",typeof(Brush),typeof(ViewModel1));

        

        public Brush BgColor
        {
            get
            {
                return (Brush)GetValue(BgColorProperty);
            }
            set
            {
                SetValue(BgColorProperty, value);
            }
            //get;set;
        }

        public ICommand ChangeBg {
            get {
                return new DelegateCommand(
                    (param) => {
                        this.BgColor = Brushes.Blue;
                        //MessageBox.Show(param.ToString());
                    }
                   ,(v)=> { return true; } );
            }
        }

      

        class DelegateCommand : ICommand
        {
            private Action<object> executeAction;
            private Func<object, bool> canExecuteFunc;
            public event EventHandler CanExecuteChanged;

            public DelegateCommand(Action<object> execute)
                : this(execute, null)
            { }

            public DelegateCommand(Action<object> execute, Func<object, bool> canExecute)
            {
                if (execute == null)
                {
                    return;
                }
                executeAction = execute;
                canExecuteFunc = canExecute;
            }

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

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

          

        }

Viewmodel1 即為window的邏輯處理類 將其設定為window的datacontext

需要注意的是BgColor 必須為依賴屬性DependencyProperty  這樣在BgColor 的value改變時才能及時影響到view

命令繫結 commandbinding

wpf 內建了很多預定義的命令 可以在view中為預定義的命令設定處理函式 (只在當前元素及其子元素中有效?)

<Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Open"
                         Executed="cmd_Open_Executed">
        </CommandBinding>
    </Window.CommandBindings>

然後再講元素的command繫結到預定義命令

<Button x:Name="c" Height="20" Width="30"  Command="ApplicationCommands.Open" >

那麼問題來了 對於 Grid 這些沒有command屬性的元素怎麼繫結命令呢

我們可以用InputBindings為輸入裝置對於此元素不同的輸入繫結處理

<Grid.InputBindings>
            <MouseBinding  Gesture="LeftClick"   Command="{Binding ChangeBg}"></MouseBinding>
            <KeyBinding Gesture="Alt+S" Command="{Binding ChangeBg}"></KeyBinding>
        </Grid.InputBindings>
先這樣吧

相關推薦

WPF的MVVM開發模式 databinding commandbinding

既然講到MVVM模式,自然第一個問題就是MVVM的含義。MVVM是Model-View-ViewModel的縮寫形式,它通常被用於WPF或Silverlight開發。模型(Model)  Model——可以理解為帶有欄位,屬性的類。檢視(View)  View——可以理解為我

webpack4 系列教程(十五):開發模式webpack-dev-server

作者按:因為教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步《webpack4 系列教程(十五):開發模式與 webpack-dev-server》原文地址。更歡迎來我的小站看更多原創內容:godbmw.com,進行“姿勢”交流 ♪(^∇^*) 0. 課程介紹和資料 &g

瀑布開發模式敏捷開發模式的區別思考

瀑布開發模式: 瀑布開發模式有以下顯著的特點: 1.嚴格把軟體專案的開發分隔成各個開發階段:需求分析,要件定義,基本設計,詳細設計,編碼,單體測試,結合測試,系統測試等。 使用里程碑的方式,嚴格定義

大資料時代的軟體開發模式技術--課程學習總結

為期2周的課程結束了,真是的受益匪淺,接下來joy將陸陸續續總結併發布每一個部落格記錄相關知識內容。這篇算是目錄了,以後將繼續補充之。 大致目錄如下圖所示: 基於資料的軟體開發: 軟體是大資料 大規模軟體重用 全域性軟體資源可重用 大資料時代下的軟體發展圖 架構層次軟體發展

微信公眾號開發(一)--開發模式編輯模式

學習步驟:分四章來講述這部分內容,下面是每章的大致內容。 1、瞭解開發模式與編輯模式,開發前的一些準備。 2、開發模式使用者、微信伺服器、個人伺服器是如何互動的。什麼是介面。 3、各種介面功能的呼叫與實現。 4、js-SDK的呼叫

淺談Android開發中的MVVM模式MVPMVC的區別

三種架構模式的演化: 什麼是MVVM? MVVM是Model-View-ViewModel的簡寫。微軟的WPF帶來了新的技術體驗,如Silverlight、音訊、視訊、3D、動畫……,這導致了軟體UI層更加細節化、可定製化。同時,在技術層面,WPF也帶來

Android開發模式之MVC,MVPMVVM的簡單介紹區別

相信大家對MVC,MVP和MVVM都不陌生,作為三個最耳熟能詳的Android框架,它們的應用可以是非常廣泛的,但是對於一些新手來說,可能對於區分它們三個都有困難,更別說在實際的專案中應用了,有些時候想用MVP的,程式碼寫著寫著就變成了MVC,久而久之就對它們三個的選擇產生了

Javascript設計模式開發實踐詳解(二:策略模式) http://www.jianshu.com/p/ef53781f6ef2

的人 思想 ram gis pan pro msg have 改變 上一章我們介紹了單例模式及JavaScript惰性單例模式應用這一次我主要介紹策略模式策略模式是定義一系列的算法,把它們一個個封裝起來,並且讓他們可以互相替換。比方說在現實中很多時候也有很多途徑到達同一個

web開發模式小結:頁面亂碼跳轉

ati 字符 -- 默認 htm *** 亂碼 控制 ram 本文由付老師總結書寫 java開發模式: (1)第一種開始模式:javaBean+jsp : 優點:可以為web程序在jsp中減少java代碼量 適用於該開發模式的

OpenCVDebugRelease模式

機器 運行速度 com 環境 使用 行為 style atl cnblogs 1、Release和Debug的區別   Release版稱為發行版,Debug版稱為調試版。   Debug中可以單步執行、跟蹤等功能,但生成的可執行文件比較大,代碼運行速度較慢。Relea

主動模式被動模式zabbix的web管理界面使用

linux監控平臺 zabbix linux 操作系統 筆記內容:19.7 主動模式和被動模式19.8 添加監控主機19.9 添加自定義模板19.10 處理圖形中的亂碼19.11 自動發現筆記日期:19.7 主動模式和被動模式所謂主動就是客戶端主動上報數據,被動則是客戶端被動去提供數據。主動模

前端開發規範總結 總結前端開發模式規範

這樣的 oat 真假 貢獻 駝峰命名 lpad 使用 後者 載器 1、前端開發規範 WEB客戶端開發自成體系, 主要用於智能終端(iPhone、Android手機、iPad、Android Pad)和傳統PC的開發。JS規範、HTML規範和CSS規範對客戶端開發進行全方位指

《JavaScript設計模式開發實踐》知識點筆記

使用 接收 context 產生 換算 應該 語言 pan 統一 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px 0.0px 0.0px 0.

BDDTDD開發模式的區別

技術人 核心 nor 進行 功能 單元測試 eve 軟件開發 驗證 TDD:測試驅動開發(Test-Driven Development) 測試驅動開發是敏捷開發中的一項核心實踐和技術,也是一種設計方法論。TDD的原理是在開發功能代碼之前,先編寫單元測試用例代碼,測試代

FWORK-數據存儲篇 -- 範式模式 (學習理解)

str -- 計數 查詢 空間 取數據 重點 保持數據 -s 理解 1、第二範式的側重點是非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分。第三範式的側重點是非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。 2、 反模式 範式可以避免數據冗余,減少數據庫的

<<敏捷軟件開發:原則、模式實踐>>時,素數產生程序,第一個java

ner ring 部分 跳過 spa urn 輸出 int stat import java.util.Arrays;public class GeneratePrimes { public static void main(String[] args) { // TOD

敏捷軟件開發:原則、模式實踐 一次編程實踐 保齡球記分代碼

spa ack ext frame owin its else int 記分 //類Score package com.java.bowlingscore; public class Scorer { public void addThrow(int pins){ itsT

微信公眾號的開發模式編輯模式

微信公眾號的開發模式和編輯模式是互斥的使用一種另一種則會關閉,開發模式需要java和文件,編輯模式就簡單了。 編輯模式:主要針對非程式設計人員及資訊釋出類公眾帳號使用。開啟該模式後,可以方便地通過介面配置“自定義選單”和“自動回覆的訊息”。 開發模式:主要針對具備開發能力的人使用。開啟該模式

Unity之C#——委託事件,觀察者模式,貓老鼠事例

委託與事件,觀察者模式,貓和老鼠事例     在Unity遊戲開發中,我們經常需要在一個類中,呼叫另一個類中的方法,比如,當玩家進入到某個地方,敵人就開始攻擊玩家。這時就需要利用委託與事件,設計觀察者模式。 此處我們利用貓和老鼠來簡單描述: 程式碼如下: Ca