国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WPF真入門教程23--MVVM簡單介紹

這篇具有很好參考價值的文章主要介紹了WPF真入門教程23--MVVM簡單介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? ?

  在WPF開發(fā)中,經(jīng)典的編程模式是MVVM,是為WPF量身定做的模式,該模式充分利用了WPF的數(shù)據(jù)綁定機制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI顯示和邏輯代碼的耦合度,如需要更換界面時,邏輯代碼修改很少,甚至不用修改。與WinForm開發(fā)相比,我們一般在后置代碼中會使用控件的名字來操作控件的屬性來更新UI,而在WPF中通常是通過數(shù)據(jù)綁定來更新UI;在響應(yīng)用戶操作上,WinForm是通過控件的事件來處理,而WPF可以使用命令綁定的方式來處理,耦合度將降低,WPF技術(shù)的主要特點是數(shù)據(jù)驅(qū)動UI,所以在使用WPF技術(shù)開發(fā)的過程中是以數(shù)據(jù)為核心的,WPF提供了數(shù)據(jù)綁定機制,當(dāng)數(shù)據(jù)發(fā)生變化時,WPF會自動發(fā)出通知去更新UI。本教程的第15到19簡單介紹了數(shù)據(jù)綁定的簡單應(yīng)用

一、MVVM介紹

  MVVM是Model-View-ViewModel(模型-視圖-視圖模型)的縮寫形式,它通常被用于WPF或Silverlight開發(fā)。我們可以通過下圖來直觀的理解MVVM模式:

wpf進階之mvvm教程,WPF真入門教程,wpf,ui

1、View就是xaml界面,也就是那個擴展名為xaml的文件,它負責(zé)與用戶交互,接收用戶輸入,把數(shù)據(jù)展現(xiàn)給用戶。

2、ViewModel就是一個C#類,負責(zé)收集需要綁定的數(shù)據(jù)和命令,通過View類的DataContext屬性綁定到View,同時也可以處理一些UI邏輯。

3、Model,就是數(shù)據(jù)庫系統(tǒng)中的實體對象,可包含屬性和行為。

  三者之間的關(guān)系:View對應(yīng)一個ViewModel,ViewModel可以聚合N個Model,ViewModel可以對應(yīng)多個View

二、MVVM的優(yōu)勢

??????MVVM的根本思想就是界面和業(yè)務(wù)功能進行分離,View的職責(zé)就是負責(zé)如何顯示數(shù)據(jù)及發(fā)送命令,ViewModel的功能就是如何提供數(shù)據(jù)和執(zhí)行命令。各司其職,互不影響。在實際的業(yè)務(wù)場景中我們經(jīng)常會遇到客戶對界面提出建議要求修改,使用MVVM模式開發(fā),當(dāng)設(shè)計的界面不滿足客戶時,我們僅僅只需要對View作修改,不會影響到ViewModel中的功能代碼,減少了犯錯的機會。隨著功能地增加,系統(tǒng)越來越復(fù)雜,相應(yīng)地程序中會增加View和ViewModel文件,將復(fù)雜的界面分離成局部的View,局部的View對應(yīng)局部的ViewModel,功能點散落在各個ViewModel中,每個ViewModel只專注自己職能之內(nèi)的事情。ViewModel包含了View要顯示的數(shù)據(jù),并且知道View的交互代碼,使用MVVM架構(gòu)具有以下優(yōu)勢:

1、易維護?2、靈活擴展??3、易測試??4、用戶界面設(shè)計師與程序開發(fā)者能更好的合作

三、MVVM簡單示例

1、在項目的model文件創(chuàng)建類Emp及EmpViewModel,內(nèi)容如下:

wpf進階之mvvm教程,WPF真入門教程,wpf,ui

wpf進階之mvvm教程,WPF真入門教程,wpf,ui

注意這個EmpViewModel叫“視圖模型”,通過數(shù)據(jù)綁定將它們綁在一起,它真的是一個很好的適配器能將模型變成某種WPF框架可以使用的東西。所以這個就是MVVM中的VM,而Emp是M,同在缺少V。

2、在control文件夾中添加窗口MVVMWindow1.xaml,具體內(nèi)容如下:

<Window x:Class="WpfApp6.control.MVVMWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp6.control"
        xmlns:vm="clr-namespace:WpfApp6.model"
        mc:Ignorable="d"
        Title="MVVM簡單介紹" Height="450" Width="800">
    <!--窗口的上下文聲明一個EmpViewModel的實例,前面必須定義vm這個命名空間-->
    <Window.DataContext>
        <vm:EmpViewModel></vm:EmpViewModel>
    </Window.DataContext>
    <Window.Resources>
        <!--聲明樣式-->
        <Style x:Key="st1">
            <Setter Property="Control.FontSize" Value="17"></Setter>
        </Style>
    </Window.Resources>
    <Grid  Style="{StaticResource st1}" >
        <Button  Content="更新" HorizontalAlignment="Left" Margin="180,256,0,0" VerticalAlignment="Top" Width="145" Click="Button_Click"/>
        <Label Content="用戶:" HorizontalAlignment="Left" Margin="112,110,0,0" VerticalAlignment="Top" RenderTransformOrigin="7.256,0.582"/>
        <!--Binding綁定視圖模型中的UserName和CompanyName-->
        <TextBox  HorizontalAlignment="Left" Height="23" Margin="205,110,0,0" TextWrapping="Wrap" Text="{Binding UserName}" VerticalAlignment="Top" Width="120"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="555,110,0,0" TextWrapping="Wrap" Text="{Binding CompanyName}" VerticalAlignment="Top" Width="120"/>
        <Label Content="公司:" HorizontalAlignment="Left" Margin="393,110,0,0" VerticalAlignment="Top"/>

    </Grid>
</Window>

?3、MVVMWindow1.xaml.cs后臺代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Shapes;
using WpfApp6.model;

namespace WpfApp6.control
{
    /// <summary>
    /// MVVMWindow1.xaml 的交互邏輯
    /// </summary>
    public partial class MVVMWindow1 : Window
    {
        EmpViewModel empvm ;
        public MVVMWindow1()
        {
            InitializeComponent();
           empvm = base.DataContext as EmpViewModel;
        }
        /// <summary>
        /// 單擊按鈕
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            empvm.UserName = "歐陽克";
            empvm.CompanyName = "華山莊";
        }
    }
}

?4、啟動程序,記得將項目啟動文件App.xaml中的啟動項改為?StartupUri="control/MVVMWindow1.xaml",運行結(jié)果,點擊按鈕時,不會有任何反應(yīng)

wpf進階之mvvm教程,WPF真入門教程,wpf,ui

?這里我們點擊更新按鈕不會有任何反應(yīng),因為還沒有實現(xiàn)數(shù)據(jù)綁定。此時視圖不會收到任何的關(guān)于屬性改變的通知。要解決這個問題我們必須實現(xiàn)名稱為INotifyPropertyChanged的接口。任何實現(xiàn)了這個接口的類,當(dāng)屬性發(fā)生改變的時候會通知所有監(jiān)聽者,所以我們需要修改視圖模型NameViewModel類,完整代碼是:

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

namespace WpfApp6.model
{
    /// <summary>
    /// 頁面視圖模型,實現(xiàn)INotifyPropertyChanged接口
    /// </summary>
    public class EmpViewModel:INotifyPropertyChanged
    {
        //構(gòu)造方法
        public EmpViewModel()
        {
            emp = new Emp() { UserName = "楊康", CompanyName = "上海金財" };
        }
        //私有字段 
        private Emp emp;
        //公共屬性
        public string UserName
        {
            get { return emp.UserName; }
            set { emp.UserName = value;RaisePropertyChanged("UserName"); }
        }
        // 屬性值發(fā)生更改時觸發(fā)的屬性
        public event PropertyChangedEventHandler PropertyChanged; 
        //屬性更改方法
        private void RaisePropertyChanged(string propertyName)
        { 
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public string CompanyName
        {
            get { return emp.CompanyName; }
            set { emp.CompanyName = value; RaisePropertyChanged("CompanyName"); }
        }
    }
}

注意視圖模型類實現(xiàn)了INotifyPropertyChanged接口,即通知屬性更改,每個屬性中增加了代碼RaisePropertyChanged,這個方法就是屬性更改時的方法,并且定義了一個事件屬性,即public event PropertyChangedEventHandler PropertyChanged;其他代碼沒有變,運行后,點擊更新效果是:wpf進階之mvvm教程,WPF真入門教程,wpf,ui

?

wpf進階之mvvm教程,WPF真入門教程,wpf,ui

?這里說明UI同步更新了,關(guān)鍵在于INotifyPropertyChanged,但是上面的方法還有不足,那就是假如有多個model需要設(shè)置屬性更改,那工作量是蠻麻煩和巨大的,這里需要改進方法,定義一個基類,讓基類實現(xiàn)INotifyPropertyChanged,讓用戶類繼續(xù)基類,具體操作是:

5、在model中添加類ViewModelBase,代碼是:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp6.model
{
    /// <summary>
    /// 模型視圖其類
    /// </summary>
    public class ViewModelBase : INotifyPropertyChanged
    {
        /// <summary>
        /// 屬性值發(fā)生更改時觸發(fā)
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 執(zhí)行更改
        /// C#5.0中的新特性CallerMemberName
        /// </summary>
        /// <param name="propertyName"></param>
        protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

6、在model創(chuàng)建另一個類,EmpViewModel2,代碼?是:

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

namespace WpfApp6.model
{
    /// <summary>
    /// 繼承基類ViewModelBase
    /// </summary>
    public class EmpViewModel2:ViewModelBase
    {
        public EmpViewModel2()
        {
            emp = new Emp() { UserName = "楊康", CompanyName = "上海金財" };
        }
        //私有字段 
        private Emp emp;
        //公共屬性
        public string UserName
        {
            get { return emp.UserName; }
            set { 
                emp.UserName = value; 
                OnPropertyChanged(); 
            }
        }
        public string CompanyName
        {
            get { return emp.CompanyName; }
            set { 
                emp.CompanyName = value; 
                OnPropertyChanged(); 
            }
        }
    }
}

?6、修改MVVMWindow1.xaml文件的一個地方,即改成以下內(nèi)容,表示現(xiàn)在窗口的上下文使用EmpViewModel2,也就是上面第5步的視圖模型,而不是原來的EmpViewModel,其他都不要改

??wpf進階之mvvm教程,WPF真入門教程,wpf,ui

?7、修改MVVMWindow1.xaml.cs代碼,如圖

?wpf進階之mvvm教程,WPF真入門教程,wpf,ui

?8、運行程序,效果如下:

wpf進階之mvvm教程,WPF真入門教程,wpf,ui

?小結(jié),我們在實際項目中應(yīng)該使用后面定義基類的方式去實現(xiàn)屬性的綁定,這才是對的。

操作起來6666,棒棒噠。文章來源地址http://www.zghlxwxcb.cn/news/detail-774174.html

到了這里,關(guān)于WPF真入門教程23--MVVM簡單介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • WPF 入門教程DockPanel介紹

    WPF 入門教程DockPanel介紹

    在 DockPanel中 可以很容易地停靠在所有四個方向的內(nèi)容(上,下,左,右)。這使它在許多情況下成為一個很好的選擇,您希望將窗口劃分為特定區(qū)域,特別是因為默認情況下,DockPanel 內(nèi)的最后一個元素,除非此功能被明確禁用,否則將自動填充其余空間(中心)。 我們在

    2024年02月05日
    瀏覽(37)
  • WPF真入門教程01--WPF簡介

    ? ? ? ? Windows Presentation Foundation (簡稱 WPF),WPF是微軟推出的基于Windows 的用戶界面框架,屬于.NET Framework 3.0的一部分。它提供了統(tǒng)一的編程模型、語言和框架,真正做到了分離界面設(shè)計人員與開發(fā)人員的工作;同時它提供了全新的多媒體交互用戶圖形界面。因與“我佩服”拼

    2024年02月06日
    瀏覽(24)
  • WPF入門到精通:3.MVVM簡單應(yīng)用及全局異常處理

    在WPF應(yīng)用程序開發(fā)中,MVVM(Model-View-ViewModel)是一種非常流行的架構(gòu)模式。它為應(yīng)用程序的設(shè)計提供了良好的分層結(jié)構(gòu)和可擴展性。 結(jié)構(gòu)分為下列三部分 Model:定義了應(yīng)用程序的數(shù)據(jù)模型?就是系統(tǒng)中的對象,可包含屬性和行為(是一個class實體,是對現(xiàn)實中事物的抽象,開

    2024年02月11日
    瀏覽(28)
  • WPF真入門教程02--新建WPF工程

    WPF真入門教程02--新建WPF工程

    在VS開發(fā)環(huán)境安裝完成之后,首先我們先新建一個WPF工程,然后對工程目錄結(jié)構(gòu)啥的要有所了解才行。 打開VS2019 ? ? ?工程建好之后,WPF應(yīng)用程序”會在“引用”里面自動添加下圖中所示的?PresentationCore、PresentationFramework、WindowsBase三大核心程序集,就是下面這個樣子 ? 默認

    2024年02月03日
    瀏覽(26)
  • MaterialDesignInXAML WPF入門教程 快速入門

    MaterialDesignInXAML WPF入門教程 快速入門

    先去MaterialDesignInXAML下載下來源碼,以及Releases,在DemoApp 中就可以看到實際的效果很驚艷了。 除了要有一定的C#、winform 基礎(chǔ)外,建議先學(xué)習(xí)一下 XAML,對整個開發(fā)環(huán)境有個基礎(chǔ)的了解,再來學(xué)習(xí)此教程。 可以去bilibili上免費學(xué)習(xí)一下。教程一共12個小時,如果不看后面的實戰(zhàn)

    2024年02月05日
    瀏覽(28)
  • WPF入門教程系列一——基礎(chǔ)

    WPF入門教程系列一——基礎(chǔ)

    一、?前言?? ?? ????? 最近在學(xué)習(xí)WPF,學(xué)習(xí)WPF首先上的是微軟的MSDN,然后再搜索了一下網(wǎng)絡(luò)有關(guān)WPF的學(xué)習(xí)資料。為了溫故而知新把學(xué)習(xí)過程記錄下來,以備后查。這篇主要講WPF的開發(fā)基礎(chǔ),介紹了如何使用Visual?Studio?2013創(chuàng)建一個WPF應(yīng)用程序。 首先說一下學(xué)習(xí)WPF的基礎(chǔ)知

    2024年02月07日
    瀏覽(32)
  • WPF教程_編程入門自學(xué)教程_菜鳥教程-免費教程分享

    WPF教程 WPF - 概述 WPF - 環(huán)境設(shè)置 WPF - Hello World WPF - XAML概述 WPF - Elements Tree WPF - 依賴屬性 WPF - 路由事件 WPF - 控件 WPF - 布局 WPF - 布局嵌套 WPF - 輸入 WPF - 命令行 WPF - 數(shù)據(jù)綁定 WPF - 資源 WPF - 模板 WPF - 樣式 WPF - 觸發(fā)器 WPF - 調(diào)試 WPF - 自定義控件 WPF - 異常處理 WPF - 本地化 WPF - 互

    2023年04月27日
    瀏覽(28)
  • WPF 入門教程Grid使用技巧

    WPF 入門教程Grid使用技巧

    在上一章中,我們向您介紹了出色的 Grid 面板,并向您展示了一些有關(guān)如何使用它的基本示例。在本章中,我們將進行一些更高級的布局,因為這是 Grid 真正閃耀的地方。首先,讓我們加入更多的列甚至一些行,以獲得真正的表格布局: 總共九個按鈕,每個按鈕都放置在自己

    2024年02月06日
    瀏覽(31)
  • WPF 入門教程DispatcherTimer計時器

    WPF 入門教程DispatcherTimer計時器

    https://www.zhihu.com/tardis/bd/art/430630047?source_id=1001 在 WinForms 中,有一個名為 Timer 的控件,它可以在給定的時間間隔內(nèi)重復(fù)執(zhí)行一個操作。WPF 也有這種可能性,但我們有 DispatcherTimer 控件,而不是不可見的控件。它幾乎做同樣的事情,但不是將它放在表單上,??而是專門從代碼

    2024年01月22日
    瀏覽(30)
  • WPF真入門教程12--ListView控件

    WPF真入門教程12--ListView控件

    ? ? ? ?ListView 控件在Windows應(yīng)用程序中常用,用于表示數(shù)據(jù)列表。如果您以前使用過 WinForms,那么您對ListView的實用性有一個很好的了解,但您應(yīng)該意識到 WPF中的ListView 不像WinForms版本那樣使用。再一次的主要區(qū)別在于,雖然WinForms ListView只是調(diào)用Windows API 函數(shù)來呈現(xiàn)常見的

    2024年02月04日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包