青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

MVVM--Model  View  ModelView 設(shè)計(jì)模式,目的是為了將表現(xiàn)與邏輯分離,使開發(fā)者更容易開發(fā)大型程序。
一般情況下就是Xaml負(fù)責(zé)View,描述控件、用戶輸入、結(jié)果輸出等,C++文件負(fù)責(zé)ModelView,負(fù)責(zé)邏輯。Model是數(shù)據(jù)和原始內(nèi)容,一般可省略。
調(diào)用關(guān)系是Model->View->ModelView,但是可以用event來反向調(diào)用。
正向:
Model(文件中或者網(wǎng)站的)數(shù)據(jù)傳給View,View接收數(shù)據(jù),傳遞給ViewModel后臺邏輯。
反向:
后臺邏輯進(jìn)行處理,產(chǎn)生一個事件,View通過處理器處理,并顯示ModelView更新的數(shù)據(jù),View再發(fā)生一個事件,被Model接收,Model將最后的數(shù)據(jù)寫入文件或者網(wǎng)絡(luò)。
MVVM的核心目的就是要降低代碼量。

MVVM用于數(shù)據(jù)綁定
1 數(shù)據(jù)綁定通知
<TextBlock Text = "{Binding ElementName = slider, Path=Value}"/>
這是兩個FrameworkElement派生對象之間的數(shù)據(jù)綁定,其中源是:Slider對象的Value屬性,目標(biāo)是:TextBlock的Text屬性。兩個屬性都是DependencyProperty(依賴屬性),對于數(shù)據(jù)綁定來說,目標(biāo)對象的屬性必須為依賴屬性,源對象的屬性可以不是。
上面的程序片段的意思是,當(dāng)Slider的Value發(fā)生變化時,變化的結(jié)果實(shí)時顯示在TextBlock的Text屬性里。這個過程是怎么實(shí)現(xiàn)的呢?(這里源和目標(biāo)都是依賴屬性,所以后面的過程是自動發(fā)生的,相當(dāng)于編譯器自動添加了一段代碼,幫助我們做數(shù)據(jù)綁定)通過事件,Binding是一個對象,當(dāng)Value屬性變化時,它提供了一個處理器來響應(yīng)Value變化的事件,并將結(jié)果放入Text中。當(dāng)然這些都是WinRT幫我們做了,并且這種綁定感覺只是在View層操作。
當(dāng)我們要在ViewModel層做數(shù)據(jù)綁定的時候,跟上面有點(diǎn)不一樣。我們的綁定目標(biāo)依然放在Xaml文件中,而源(source)則放在ViewModel類中。這種方法是View(Xaml)和ViewModel(C++/Cx class)交互的基本模式。

綁定源不必是依賴屬性,但是得有一套機(jī)制來通知Binding對象,該屬性被改變了。如果不是依賴屬性的話,這種通知不像上面的代碼那樣自動發(fā)生,必須通過event來實(shí)現(xiàn)。

下面是幾種實(shí)現(xiàn)的方法:
1. 標(biāo)準(zhǔn)方法通過INotifyPropertyChanged接口,該接口非常簡單,只有一個event
     public interface class INotifyPropertyChanged{
         event PropertyChangedEventHandler PropertyChanged;//更改屬性時fire這個event
     }

     event PropertyChangedEventHandler^ PropertyChanged {
                  void add (PropertyChangedEventHandler^ value);
                  void remove (PropertyChangedEventHandler^ value);
               }

     下面是摘抄的MSDN上的:
     INotifyPropertyChanged 接口用于向客戶端(通常是執(zhí)行綁定的客戶端)發(fā)出某一屬性值已更改的通知。

例如,考慮一個帶有名為 FirstName 屬性的 Person 對象。 若要提供一般性屬性更改通知,則 Person 類型實(shí)現(xiàn) INotifyPropertyChanged 接口并在 FirstName 更改時引發(fā) PropertyChanged 事件。

若要在將客戶端與數(shù)據(jù)源進(jìn)行綁定時發(fā)出更改通知,則綁定類型應(yīng)具有下列任一功能:

  • 實(shí)現(xiàn) INotifyPropertyChanged 接口(首選)。

  • 為綁定類型的每個屬性提供更改事件。

 不能同時執(zhí)行這兩個方法。
摘抄一段程序以便理解:C++代碼

 1 [Windows::UI::Xaml::Data::Bindable]
 2    public ref class RgbViewModel sealed : Windows::UI::Xaml::Data::INotifyPropertyChanged
 3    {
 4    private:
 5        double red, green, blue;
 6    public:
 7        virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler^ PropertyChanged;
 8
 9        property double Red
10        {
11            double get();
12            void set(double value);
13        }

14//
15     protected:
16        void OnPropertyChanged(Platform::String^ propertyName);
17}
;

定義了一個屬性Red,當(dāng)Red改變時,調(diào)用OnPropertyChanged(..)方法,該方法調(diào)用PropertyChanged()event

void RgbViewModel::Red::set(double value)
{
    
if (red != value)
    
{
        red 
= value;
        OnPropertyChanged(
"Red");
        Calculate();
    }

}


void RgbViewModel::OnPropertyChanged(String^ propertyName)
{
    PropertyChanged(
thisref new PropertyChangedEventArgs(propertyName));
}


到此為止,我了解到的邏輯是這樣的:一個類的屬性想要作為源數(shù)據(jù),必須要實(shí)現(xiàn)INotifyPropertyChenged接口,該接口中有一個event,當(dāng)相應(yīng)的屬性改變時,激發(fā)這個event,這時,通知Binding這個對象,將改變了的值放入目標(biāo)屬性中去。所以下一步,就是將源和對象屬性用Binding對象聯(lián)系起來。這一過程是在View中做的,即在Xaml文件中。

<Page.Resources>
        
<local:RgbViewModel x:Key="rgbViewModel" /> //初始化rgbViewModel。將ViewModel作為資源是一種Xaml訪問該對象的方法。還有另外一種方法
</Page.Resources>

     
<Slider Grid.Column="0"
                Grid.Row
="1"
                Value
="{Binding Source={StaticResource rgbViewModel}, 
                                Path=Red, 
                                Mode=TwoWay}"

                ThumbToolTipValueConverter
="{StaticResource hexConverter}"
                Orientation
="Vertical"
                Foreground
="Red" />

        
<TextBlock Text="{Binding Source={StaticResource rgbViewModel}, 
                                  Path=Red, 
                                  Converter={StaticResource hexConverter}}"

                   Grid.Column
="0"
                   Grid.Row
="2"
                   Foreground
="Red" />



另外,在做練習(xí)的時候發(fā)現(xiàn),在聲明一個新類做綁定源的時候,必須加上:[Windows::UI::Xaml::Data::Bindable]這句話,不然不能實(shí)現(xiàn)綁定。

2. 書中的另一個方法是用一個BindableBase類來實(shí)現(xiàn),這個類也是繼承了INotifyPropertyChanged接口。如果我們從這個類繼承,那就省去了OnPropertyChanged()這一步,因?yàn)榛愐呀?jīng)為我們實(shí)現(xiàn)了。但是,在c++中我沒有查到這個類,而且書中的程序也是直接繼承接口來做,跟第一種方法相同。

3. DataContext屬性
目前為止,我們看到了三種方法:
     1). Source and Target are both dependency property, just use <TextBlock Text = "{Binding ElementName = slider, Path=Value}"/> to do binding.
     2). Source property is not denpendency property. Implement a class derived from INotifyPropertyChanged, and add a event which is when property chenged fired. Like : Value="{Binding Source={StaticResource rgbViewModel}, 
                                Path=Red, 
                                Mode=TwoWay}"


     3).Source property is not denpendency property. Implement a class derived from BindableBase class.
第四種方法:指定一個綁定源,如果ElementName, Source, RelativeSource都為NULL的話,那么Binding(它是個對象)將檢查綁定目標(biāo)的DataContext屬性。DataContext是FrameworkElement定義的屬性,它可以從Visual Tree從上到下傳播,不是所有的屬性都可以這么做。Foreground,和所有的Font-related屬性可以。

在代碼中,你可以在構(gòu)造函數(shù)中實(shí)例化一個DataContext of Page

先說下我的理解,DataContext翻譯過來就是數(shù)據(jù)上下文,就是說,一些東西包含在這個上下文中,你不需要明確地指出來。像之前的第二種方法,利用INotifyPropertyChanged接口來做的,在Xaml文件中,你要綁定一個東西,要寫長長的一段話,如果你明確地表示你要綁定的東西在上下文中,那么你可以省略很多東西。確實(shí)也是這樣的。
你可以用兩種方法設(shè)置DataContext
      第一種方法:在code中寫,注意這個屬性是Page的:
                        第一步,在構(gòu)造函數(shù)中: RgbViewModel^ viewModel = ref new RgbViewModel();
                                                          this->DataContext = viewModel;
                        第二步,在Xaml文件中:
                                                        <Slider Grid.Column="0"
                                                          Grid.Row="1"
                                                          Value="{Binding Red, Mode=TwoWay}"
                        就結(jié)束了。
     第二種方法:全部在Xaml文件中做:
                       第一步, 在page.Resources中:
                                                     <Page.Resources>
                                                          <local:rgbColor x:Key="RgbColor"/>
                                                      </Page.Resources>
                       第二步,在Grid中:
                                                     <Grid  DataContext="{StaticResource RgbViewModel}"> or
                                                     <Grid DataContext="{ Binding Source={StaticResource RgbViewModel} }".../>
                       第三步,同第一種方法第二步。


總結(jié):MVVM的目的是為了把表現(xiàn)與邏輯分開來,相互之間不要有太大的影響,讓程序員能夠?qū)P牡刈瞿骋粔K。但有些時候必須要有聯(lián)系,外部傳入數(shù)據(jù),控件接收數(shù)據(jù),并傳入后臺處理,后臺處理后的數(shù)據(jù)又要顯示在控件上,這就需要數(shù)據(jù)綁定。數(shù)據(jù)綁定的方法已經(jīng)說了幾遍了,有3種方法,一種是源和目標(biāo)都是依賴屬性的時候,直接在Xaml文件中binding就行了,方法也比較簡單;第二種和第三種方法針對的都是源不是依賴屬性的時候,但目標(biāo)必須是依賴屬性,這時第二種方法要使用INotifyPropertyChanged接口,當(dāng)屬性改變的時候,一個Event被激活,并且提醒Binding對象將新值寫入目標(biāo)數(shù)據(jù);第三種方法是設(shè)置DataContext,這種方法最簡單,只需要在Xaml文件中設(shè)置一下就好。
附一個OnSizeChanged方法,以

void SliderViewModel::MainPage::OnSizeChanged(Platform::Object^ sender, Windows::UI::Xaml::SizeChangedEventArgs^ e)
{
    
if(e->NewSize.Width < e->NewSize.Height)
    
{
        forChangeRow
->Height = GridLength(1,GridUnitType::Star);
        forChangeColumn
->Width = GridLength(0);
        

        Grid::SetColumn(resultRect, 
0);
        Grid::SetRow(resultRect,
3);
        Grid::SetColumnSpan(resultRect,
3);
    }

    
else
    
{
        forChangeRow
->Height = GridLength(0);
        forChangeColumn
->Width = GridLength(3, GridUnitType::Star);
        Grid::SetColumn(resultRect, 
3);
        Grid::SetRow(resultRect,
0);
        Grid::SetRowSpan(resultRect,
3);
    }

}

后用




posted on 2012-06-26 17:24 Dino-Tech 閱讀(1419) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲伊人伊色伊影伊综合网| 国产精品一卡二| 欧美在线看片| 欧美区亚洲区| 欧美国产第二页| 国产主播一区| 亚洲欧美日韩成人高清在线一区| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲国产清纯| 国产精品一区一区三区| 日韩亚洲欧美在线观看| 亚洲欧洲偷拍精品| 久久精品国产免费看久久精品| 亚洲一区激情| 欧美午夜激情小视频| 亚洲国产视频一区| 亚洲免费成人av| 欧美va亚洲va香蕉在线| 欧美成人69av| 亚洲激情在线观看| 你懂的视频欧美| 亚洲丰满少妇videoshd| 亚洲激情电影在线| 欧美成人福利视频| 欧美韩日视频| 亚洲国产精品久久久| 麻豆精品在线播放| 欧美成人午夜视频| 亚洲日本中文| 美女啪啪无遮挡免费久久网站| 老司机精品久久| 国产一区二区三区在线观看免费 | 欧美高清视频| 91久久综合亚洲鲁鲁五月天| 久久婷婷久久| 久久免费国产| 在线观看成人网| 久久9热精品视频| 蜜臀av在线播放一区二区三区| 国产亚洲在线| 久久人人爽爽爽人久久久| 毛片一区二区| 99re66热这里只有精品4 | 另类酷文…触手系列精品集v1小说| 久久精品国产成人| 影音先锋日韩精品| 欧美了一区在线观看| 亚洲深夜福利网站| 久久免费视频观看| 亚洲日本欧美在线| 国产精品久久国产三级国电话系列| 亚洲天堂成人在线观看| 久久久精品一区| 亚洲人www| 国产精品成人免费视频| 欧美在线视频网站| 最新亚洲电影| 久久精品亚洲一区二区三区浴池 | 亚洲国产午夜| 欧美日韩免费一区二区三区视频 | 国产日韩精品在线| 毛片一区二区| 亚洲色诱最新| 欧美高清在线| 欧美亚洲综合在线| 亚洲欧洲精品一区二区三区波多野1战4| 欧美日韩国产免费| 久久久91精品国产| 一区二区三区国产| 久久久精品一品道一区| 中文在线不卡| 亚洲级视频在线观看免费1级| 欧美日韩亚洲综合一区| 久久精品国产亚洲精品| aa级大片欧美三级| 另类专区欧美制服同性| 亚洲综合国产精品| 亚洲三级电影全部在线观看高清| 国产日本欧美视频| 欧美另类99xxxxx| 老司机一区二区三区| 亚洲欧美日韩精品久久亚洲区 | 免费不卡亚洲欧美| 亚洲欧美一区二区原创| 亚洲日本成人女熟在线观看| 久久久久久穴| 欧美一区二区三区免费观看视频| 妖精视频成人观看www| 亚洲国产综合在线| 国产在线观看一区| 国产精品亚洲片夜色在线| 欧美日韩不卡在线| 欧美成人午夜剧场免费观看| 久久久免费观看视频| 久久爱www| 欧美亚洲免费高清在线观看| 亚洲夜晚福利在线观看| 亚洲麻豆国产自偷在线| 亚洲国产日韩一区二区| 亚洲成色777777在线观看影院| 久久久久久久网| 久久久久久久久久久一区| 欧美综合国产精品久久丁香| 午夜精品久久久| 性娇小13――14欧美| 亚洲欧美日韩视频一区| 亚洲女人av| 久久se精品一区精品二区| 欧美一区二区三区免费大片| 欧美制服第一页| 久久aⅴ国产紧身牛仔裤| 久久成人综合视频| 久久久一本精品99久久精品66| 久久久久91| 老牛影视一区二区三区| 欧美成人免费va影院高清| 欧美大香线蕉线伊人久久国产精品| 另类图片国产| 亚洲国产欧美一区| 99香蕉国产精品偷在线观看| 夜夜爽www精品| 亚洲永久精品大片| 欧美在线综合| 免费在线日韩av| 欧美私人网站| 国产精品视频专区| 韩国美女久久| 亚洲乱码久久| 亚洲一区二区少妇| 久久高清一区| 亚洲第一搞黄网站| 一区二区欧美在线观看| 欧美一区二区三区四区夜夜大片| 久久久999精品视频| 欧美国产一区二区在线观看| 国产精品激情电影| 国产亚洲一区二区三区| 亚洲高清123| 亚洲社区在线观看| 久久久久久精| 日韩网站在线观看| 欧美一区精品| 欧美日韩成人一区二区三区| 国产精品一区二区三区免费观看| 国产综合一区二区| 亚洲图片欧美一区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲国内在线| 午夜精品成人在线视频| 噜噜噜躁狠狠躁狠狠精品视频 | 99在线精品观看| 久久激情五月婷婷| 亚洲精品中文字幕女同| 亚洲女人av| 欧美激情第一页xxx| 国产深夜精品福利| 中文国产成人精品久久一| 久久欧美肥婆一二区| 在线视频你懂得一区二区三区| 老巨人导航500精品| 国产精品啊啊啊| 亚洲精品视频免费在线观看| 久久精品官网| 亚洲午夜精品久久久久久浪潮| 免费视频一区二区三区在线观看| 国产精品视频成人| avtt综合网| 欧美成人激情在线| 欧美一级视频| 国产女人水真多18毛片18精品视频| 亚洲精品一区二区三区在线观看| 久久精品成人欧美大片古装| 一区二区精品在线观看| 欧美国产先锋| 亚洲国产成人久久综合一区| 久久精品三级| 亚洲欧美经典视频| 国产精品日日做人人爱| 亚洲综合视频在线| 日韩视频在线观看一区二区| 欧美a级片网| 亚洲精美视频| 欧美国产精品人人做人人爱| 欧美在线日韩| 国产一区二区按摩在线观看| 亚洲欧美视频在线观看视频| 亚洲激情网站| 欧美激情亚洲自拍| 亚洲精品偷拍| 亚洲黄一区二区| 欧美国产国产综合| 亚洲免费精品| 亚洲乱亚洲高清| 欧美色区777第一页| 一区二区三区视频观看| 亚洲精品裸体| 国产精品v欧美精品v日韩| 亚洲午夜久久久久久久久电影院| 日韩视频在线免费| 国产精品乱码人人做人人爱|