MVVM學習筆記

来源:http://www.cnblogs.com/xiangyueqiaomai/archive/2016/08/06/5744560.html
-Advertisement-
Play Games

MVVM學習筆記 1、MVVM的簡介 MVVM模式是Model-View-ViewModel模式的簡稱,也就是由模型(Model)、視圖(View)、視圖模型(ViewModel),其目的是為了實現將業務和界面分開,降低耦合度。 2、示例(綁定TextBox和Combox控制項) 總體結構: View ...


MVVM學習筆記

1、MVVM的簡介

 MVVM模式是Model-View-ViewModel模式的簡稱,也就是由模型(Model)、視圖(View)、視圖模型(ViewModel),其目的是為了實現將業務和界面分開,降低耦合度。

2、示例(綁定TextBoxCombox控制項)

總體結構:

 

View層代碼:

        <Label Content="購買數:"
               Style="{StaticResource LabStyle}"
               Grid.Row="3"
               Grid.Column="0" />
        <TextBox Grid.Row="3"
                 Grid.Column="1"
                 Style="{StaticResource TextBoxStyle}"
                 Text="{Binding BuyTextBox,UpdateSourceTrigger=PropertyChanged}">
        </TextBox>

 <ComboBox Grid.Row="0"
                  Grid.Column="1"
                  Style="{StaticResource ComboxStyle}">
            <ComboBoxItem Content="西瓜" />
        </ComboBox>
        <ComboBox Grid.Row="1"
                  Grid.Column="1"
                  Style="{StaticResource ComboxStyle}"
                  ItemsSource="{Binding Prices}"
                  SelectedItem="{Binding SelectPrice, UpdateSourceTrigger=PropertyChanged}">
        </ComboBox>
View Code

 

ViewModel層代碼

   /// <summary>
        /// 設置購買量屬性
        /// </summary>
        public int BuyTextBox
        {
            get { return m_buyNum; }
            set
            {
                m_buyNum = value;
                //計算金額
                m_money = m_selectPrice*m_buyNum;
                if (m_buyNum > m_surplus)
                {
                    MessageBox.Show("購買數量大於剩餘數量,請重新輸入購買數量!");
                    m_buyNum = 0;
                    m_money = 0;
                }
                OnPropertyChange<CalculateFruitVm>(vm => vm.BuyTextBox);
            }
        }
View Code

 

    /// <summary>
        /// 設置價格屬性
        /// </summary>
        public ObservableCollection<int> Prices
        {
            get { return m_prices; }
            set
            {
                m_prices = value;
                OnPropertyChange<CalculateFruitVm>(vm => vm.Prices);
            }
        }
View Code

 

 /// <summary>
        /// 設置選擇價格屬性
        /// </summary>
        public int SelectPrice
        {
            get { return m_selectPrice; }
            set
            {
                m_selectPrice = value;
                m_money = m_selectPrice*m_buyNum;
                OnPropertyChange<CalculateFruitVm>(vm => vm.SelectPrice);
            }
        }
View Code

 

  /// <summary>
        /// 構造函數CalculateFruitVm
        /// </summary>
        public CalculateFruitVm()
        {
            m_prices.Add(4);
            m_selectPrice = 4;
            m_prices.Add(5);
        }
View Code

 

註意:這裡是在構造函數CalculateFruitVm中設置價格並選擇價格,因價格是combox控制項,除了需要設置價格屬性外,還需要設置價格選擇屬性。

Button按鈕

View層代碼

            <Button Content="返回"
                    Grid.Column="2"
                    Style="{StaticResource ButtonStyle}"
                    HorizontalAlignment="Left"
                    Command="{Binding CancleCommand}"></Button>
View Code

 

ViewModel層代碼

        /// <summary>
        /// CancleCommand命令
        /// </summary>
        public ICommand CancleCommand
        {
            get { return m_cancelCommand; }
        }
View Code

 

        /// <summary>
        /// 構造函數CalculateFruitVm
        /// </summary>
        public CalculateFruitVm()
        {
            m_cancelCommand = ICommandFactory.CreateCommand(CancelCmdExecute, CanCancelCmdExecute);
        }
View Code

 

        /// <summary>
        /// 聲明CancelEvent事件
        /// </summary>
        public event EventHandler<EventArgs> CancelEvent;
        /// <summary>
        /// CanCancelCmdExecute事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private bool CanCancelCmdExecute(object arg)
        {
            return true;
        }
View Code

 

        /// <summary>
        /// CancelCmdExecute事件
        /// </summary>
        /// <param name="obj"></param>
        private void CancelCmdExecute(object obj)
        {
            if (CancelEvent != null)
            {
                CancelEvent(this, EventArgs.Empty);
            }
        }
View Code

 

.xaml.cs代碼

  public CalculateFruit()
        {
            InitializeComponent();
            CalculateFruitVm calculateFruitVm = new CalculateFruitVm();
            DataContext = calculateFruitVm;
            calculateFruitVm.CancelEvent += calculateFruitVm_CancelEvent;
        }
View Code

 

        /// <summary>
        /// 點擊返回按鈕,返回主界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void calculateFruitVm_CancelEvent(object sender, EventArgs e)
        {
            MainWindow mainWindow = new MainWindow();
            mainWindow.Show();
            this.Hide();
        }
View Code

 

Button按鈕需要在View層用command綁定事件,ViewModel中創建命令、構造函數、聲明事件,最後在.xaml.cs中載入ViewModel,並實現界面跳轉、關閉等操作。

3、總結

 MVVM 中更好的實現了面向對象中的繼承和封裝,所有的命令都繼承自ICommand介面,將所有的命令用ViewModel層去實現。

當界面之間需要互相傳值時,需要在VM中傳遞界面需要的值,實例化需要傳到哪個界面的VM,示例如下:

隱藏事件

   private void HideCmdExecute(object obj)
        {
            if (m_buyNum > 0 && m_selectPrice > 0)
            {
                if (HideEvent != null)
                {
                    //計算剩餘量
                    m_surplus -= m_buyNum;
                    //計算售賣總量
                    CalculateNum += m_buyNum;
                    //計算售賣總金額
                    CalculateMoney += m_money;
                    //new出ResultCalculateVm並賦值
                    ResultCalculateVm resultCalculateVm = new ResultCalculateVm();
                    resultCalculateVm.SalesNumberTextBox = CalculateNum;
                    resultCalculateVm.TotalMoney = CalculateMoney;
                    resultCalculateVm.TotalSurplus = m_surplus;
                    HideEvent(this, new FruitEventArgs {ResultCalculateVm = resultCalculateVm});
                }
            }           
        }
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 安裝前說明: 先安裝gcc gcc-c++ make 等 可用yum install -y gcc gcc-c++ make 也可以使用rpm安裝不過需要註意依賴 1.安裝apache 下載鏈接:https://yunpan.cn/Oc6kuDyejRsMqe 訪問密碼 07d2 解壓:tar –z ...
  • 運行環境:CentOS6.7 故障原因: 昨天線上執行命令yum -y update 在命令執行途中,強制中斷並直接運行poweroff命令關機。再次開機出現如圖所示故障指示: 根據提示信息分析,可能因為執行更新命令未完成導致系統內核信息混亂。 故障解決方案: 插入系統光碟,修改主板BIOS從光碟機引 ...
  • Linux學習筆記——基於鳥哥的Linux私房菜 ***** ARM與嵌入式linux的入門建議 (1) 學習基本的裸機編程:ARM7或ARM9,理解硬體架構和控制原理 (這一步是絕對的根基) (2) 使用Linux系統進行一些基本的實驗 (3) 研究完整的Linux系統的運行過程 : 完整Linu ...
  • 在WEB開發時,網站是以 的用戶運行的,而我在本地是以 的用戶編輯的。這就帶來一個問題:如果所有文件屬於 ,那麼網站運行需要寫文件時就因 無許可權而失敗 ;如果所有文件屬於 ,那麼 則需要 獲取許可權才能寫進去 。最鬱悶的是使用git合併的時候,如果忘了加 ,就會因許可權不足提示大量的合併失敗,需要先回滾 ...
  • 第一步:安裝anaconda anaconda自帶一系列科學計算包 下載鏈接:http://pan.baidu.com/s/1b4jWlg 密碼:fqq3 接著配置環境變數:如我安裝在D盤下 試一下命令行啟動,確保ipython從anaconda啟動 第二步:安裝spark(需要提前安裝JDK) 到 ...
  • 使用Symantec Backup Exec將幾台Linux伺服器上的RMAN備份收帶時,偶爾會遇到作業備份失敗的情況,檢查Job History,就會發現有“Access denied to directory u05/backup/backupsets" 這類錯誤,當然實際路徑為/u05/bac ...
  • 本萌新剛學習到如何os x跳轉頁面 先創建一個項目 選擇os x 創建一叫skip的項目 打開Mai.storyboard,拉入一個view controller 拉入一個button ,然後按著control 然後顯示出,我選擇modal,(這些你們慢慢試,我也不太知道) 選擇後就會出現 點擊bu ...
  • 用nopcomerce3.8版本的同行註意了,前2天發佈3.8正式版後,作者收到一些BuG,作者修複後重新提供了一個源代碼包下載地址,不是github上的那個鏈接。去作者官網論壇我那個鏈接地址,或關註微信公眾號aspnetcore發消息獲取鏈接地址。我們只能幫你到這了 原文地址:http://www ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...