真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

WP8開(kāi)發(fā)日志(2):MVC設(shè)計(jì)模式入門(mén)-創(chuàng)新互聯(lián)

由于最近在等待新工作的入職,閑來(lái)無(wú)事還是完善一下我的WP8開(kāi)發(fā)的博客吧。經(jīng)過(guò)許久回頭看一下我那半成品的WP應(yīng)用,內(nèi)牛滿面,之前Google了N久的東西,居然也不記得了,真是不得不認(rèn)老啊。

在孟連等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè),孟連網(wǎng)站建設(shè)費(fèi)用合理。

這段時(shí)間接觸了一下B/S的東西,覺(jué)得那東西真不是人用的,一旦工程量上去,后續(xù)開(kāi)發(fā)很大一部分時(shí)間都是在Debug中渡過(guò),很是糾結(jié)?,F(xiàn)在業(yè)內(nèi)普遍的對(duì)移動(dòng)開(kāi)發(fā)的看法是——web應(yīng)用是種趨勢(shì),可是個(gè)人覺(jué)得除非現(xiàn)階段的移動(dòng)網(wǎng)絡(luò)環(huán)境有質(zhì)的改變,否則用戶體驗(yàn)會(huì)很有問(wèn)題。然后簡(jiǎn)單的玩了一下node.js,覺(jué)得后臺(tái)其實(shí)也可以不用那么復(fù)雜,想想,還是老老實(shí)實(shí)的寫(xiě)回自己的客戶端應(yīng)用好了。

廢話就不多說(shuō)了,先簡(jiǎn)單的介紹一下本篇的目的吧。MVC這個(gè)東西,現(xiàn)下看起來(lái)很流行,Model-View-Control,其實(shí)我個(gè)人并不清楚其概念所謂,其實(shí)說(shuō)白了就是當(dāng)年的“所見(jiàn)即所得”,一個(gè)意思。之前接觸了一下WPF,就是給這個(gè)概念給搞死,但不管怎么樣,xaml可能是MS的開(kāi)發(fā)趨勢(shì),MCV又是其中一個(gè)極重要的概念,不入門(mén)不行。

MVC的更多的概念性解析請(qǐng)諸位百度或google吧,它的核心是數(shù)據(jù),MVC是一種展現(xiàn)數(shù)據(jù)呈現(xiàn)方式的一種開(kāi)發(fā)手段,雖然比純代碼性的呈現(xiàn)方式多了一些額外的工作,可是,必須要記住,現(xiàn)在做多一些是為了將來(lái)少做一些,其優(yōu)勢(shì)還是相當(dāng)可觀的。

(1)構(gòu)造數(shù)據(jù)類DataItem

WinForm的項(xiàng)目里,我們想在程序設(shè)計(jì)的階段預(yù)覽ListBox是怎么顯示數(shù)據(jù),那幾乎是不可能的,除非我將程序跑起來(lái),在人類審美觀崛起的現(xiàn)在,代碼與界面分離設(shè)計(jì)可以有效的通過(guò)分工實(shí)現(xiàn)人力資源的大化的利用,而這也是MVC的主要任務(wù)。

寫(xiě)WinForm時(shí),我會(huì)這么設(shè)計(jì)一個(gè)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)體:

struct TestDataItem
{
    int Index;
    string Name;
    boo Flag;
}

可使用MVC的方式,編譯器沒(méi)辦法識(shí)別這樣的定義,所以必須將這簡(jiǎn)單的結(jié)構(gòu)體擴(kuò)展成一個(gè)特定的類:

//TestDataItem.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MvcTest
{
    /// 
    /// 數(shù)據(jù)集的Item類,繼承INotifyPropertyChanged,INotifyPropertyChanging接口
    /// 
    public partial class TestDataItem : INotifyPropertyChanged, INotifyPropertyChanging
    {
        /// 
        /// 屬性更改的事件參數(shù)
        /// 
        private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
        /// 
        /// 數(shù)據(jù)屬性變化的事件回調(diào)
        /// 
        public event PropertyChangingEventHandler PropertyChanging;
        public event PropertyChangedEventHandler PropertyChanged;
        /// 
        /// Item的成員屬性
        /// 
        private int _index;
        private string _name;
        private bool _flag;
        /// 屬性更改的響應(yīng)函數(shù)
        #region
        partial void OnIndexChanging(int value);
        partial void OnIndexChanged();
        partial void OnNameChanging(string value);
        partial void OnNameChanged();
        partial void OnFlagChanging(bool value);
        partial void OnFlagChanged();
        #endregion
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
        /// 類接口的實(shí)現(xiàn)
        #region
        /// 
        /// INotifyPropertyChanging接口的實(shí)現(xiàn)函數(shù)
        /// 
        protected virtual void SendPropertyChanging()
        {
            if ((this.PropertyChanging != null))
            {
                this.PropertyChanging(this, emptyChangingEventArgs);
            }
        }
        /// 
        /// INotifyPropertyChanged接口的實(shí)現(xiàn)
        /// 
        /// 
        protected virtual void SendPropertyChanged(String propertyName)
        {
            if ((this.PropertyChanged != null))
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
        /// 數(shù)據(jù)的公共屬性
        #region
        public int Index
        {
            get
            {
                return this._index;
            }
            set
            {
                if(this._index != value)
                {
                    this.OnIndexChanging(value);
                    this.SendPropertyChanging();
                    this._index = value;
                    this.SendPropertyChanged("Index");
                    this.OnIndexChanged();
                }
            }
        }
        public string Name
        {
            get
            {
                return this._name;
            }
            set
            {
                if(this._name != value)
                {
                    this.OnNameChanging(value);
                    this.SendPropertyChanging();
                    this._name = value;
                    this.SendPropertyChanged("Name");
                    this.OnNameChanged();
                }
            }
        }
        public bool Flag
        {
            get
            {
                return this._flag;
            }
            set
            {
                if (this._flag != value)
                {
                    this.OnFlagChanging(value);
                    this.SendPropertyChanging();
                    this._flag = value;
                    this.SendPropertyChanged("Flag");
                    this.OnFlagChanged();
                }
            }
        }
        #endregion
    }
}

此類的核心是INotifyPropertyChanged,INotifyPropertyChanging這兩個(gè)接口(不懂請(qǐng)百度唄,我也懂不了多少)。因?yàn)閿?shù)據(jù)的窗口(像Grid或LongListSelector)要感知每一條TestDataItem的屬性變化,然后這個(gè)類里面就存在各種的回調(diào)或事件啦。

(2)構(gòu)造數(shù)據(jù)集TestDataItemCollection

這步理解就簡(jiǎn)單一點(diǎn)了,數(shù)據(jù)容器呈現(xiàn)的是整體的數(shù)據(jù)集合,這個(gè)集合也需要一個(gè)特殊的類,否則編譯器不知道怎么去解析(我只能這么理解),有玩過(guò)數(shù)據(jù)綁定的童鞋應(yīng)該能弄懂這點(diǎn)。

當(dāng)然,TestDataItem的集合類也需要實(shí)現(xiàn)一個(gè)特殊的接口INotifyPropertyChanged——沒(méi)錯(cuò),跟上面TestDataItem實(shí)現(xiàn)的接口一樣,可以這么理解,這個(gè)接口是MVC的核心所在。

//TestDataItemCollection.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MvcTest
{
    /// 
    /// 數(shù)據(jù)集的類
    /// 
    public class TestDataCollection : INotifyPropertyChanged
    {
        /// 
        /// 數(shù)據(jù)集合
        /// 
        public ObservableCollection TestDataItems { get; private set; }
        /// 
        /// 屬性更改事件回調(diào)
        /// 
        public event PropertyChangedEventHandler PropertyChanged;
        /// 
        /// 構(gòu)造函數(shù)
        /// 
        public TestDataCollection()
        {
            this.TestDataItems = new ObservableCollection();
        }
        /// 
        /// INotifyPropertyChanged接口的實(shí)現(xiàn)
        /// 
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

(3)構(gòu)造數(shù)據(jù)集示例ViewModel

這一步設(shè)計(jì)要呈現(xiàn)的數(shù)據(jù)例子,其用到的xmal的文件,可是在Visual Studio新建項(xiàng)的時(shí)候,并沒(méi)有這一選項(xiàng),可是我們會(huì)發(fā)現(xiàn)WP的頁(yè)面文件格式就xaml的,所以不妨新建一個(gè)頁(yè)面,將其重命名為T(mén)estDataViewModel.xaml,然后,刪掉頁(yè)面正面的cs等文件,將下面這段xaml代碼粘上去——當(dāng)然,你直接手敲上去也是沒(méi)有問(wèn)題的。

//TestDataViewModel.xaml



    
    
    
        
        
        
        
        
        
    

注意看xaml的注釋內(nèi)容,但看起來(lái)不難,難的一步是如何呈現(xiàn)上面的數(shù)據(jù)集于PhonePage上。

(4)呈現(xiàn)ViewModel數(shù)據(jù)集

首先,我們要選一個(gè)數(shù)據(jù)容器,個(gè)人比較喜歡LongListSelector,但似乎沒(méi)有其分的選擇,將上面的數(shù)據(jù)集例子綁定上去;然后,設(shè)計(jì)一下單條數(shù)據(jù)呈現(xiàn)的樣式,要用到DataItemTemplate,這也許我將來(lái)會(huì)詳講。就這兩條,直接上代碼:

//MainPage.xaml


                                                                                                                                                            
    
    
        
            
                
                
                
                
            
        
    
    
        
            
            
        
        
            
            
        
        
            
            
                
            
        
    

注意以上代碼的兩行注釋跟第10行的內(nèi)容,這是其關(guān)鍵所在,新建一個(gè)默認(rèn)的WP工程,就多了總共三處地方,于是,你就能看到以下的效果啦:

WP8開(kāi)發(fā)日志(2):MVC設(shè)計(jì)模式入門(mén)

于是,通過(guò)MVC的設(shè)計(jì)手段,我們就能看到在WP設(shè)計(jì)頁(yè)面上看到數(shù)據(jù)集合是如何呈現(xiàn)的啦。至于實(shí)際運(yùn)行如何加載數(shù)據(jù)集就不須要多說(shuō)吧?只要給LongListSelector的ItemSource屬性賦值就好了,一句話的功夫。

結(jié)語(yǔ):

以上的是一個(gè)簡(jiǎn)單的MVC模式設(shè)計(jì)的例子,其實(shí)這工作一個(gè)人做看不出什么優(yōu)勢(shì),可是,我們從中看出,這樣的設(shè)計(jì)手法,可以讓界面邏輯跟功能邏輯分開(kāi)設(shè)計(jì)提高效率,還有,如果程序以后要改進(jìn),從預(yù)覽窗口我們也更容易知道自己需要更改哪些東西,總之,優(yōu)勢(shì)不少就是啦。

自己還有一個(gè)問(wèn)題,如何在同一個(gè)頁(yè)面呈現(xiàn)兩個(gè)數(shù)據(jù)集呢?嗯,這是個(gè)問(wèn)題。對(duì)了,附上工程例子。

附件:http://down.51cto.com/data/2364279

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)站標(biāo)題:WP8開(kāi)發(fā)日志(2):MVC設(shè)計(jì)模式入門(mén)-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://weahome.cn/article/jossj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部