平穩轉型WP系列之在Windows Phone中談“委託”、“事件”和“介面”(一、深入理解)

來源:互聯網
上載者:User

園子裡有很多講“委託”,“事件”和“介面”的文章,好文章有很多。在這片文章裡將結合“Windows Phone”的一個開發執行個體,.net機制和自己的粗陋的理解來介紹。

首先看執行個體全部代碼:

後台代碼:

 public class NotepadItem:INotifyPropertyChanged
    {
        public string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                NotifyPropertyChanged("Title");
            }
        }

        public string _intro;
        public string Intro
        {
            get { return _intro; }
            set
            {
                _intro = value;
                NotifyPropertyChanged("Intro");
            }
        }

        public string _cont;
        public string Cont
        {
            get { return _cont; }
            set
            {
                _cont = value;
                NotifyPropertyChanged("Cont");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propertyName)
        {
            if (null != PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

前台XAML代碼:

<controls:Pivot Title="手機保險箱">
            <!--Pivot item one-->
            <controls:PivotItem Header="秘密記事本">
                <!--Double line list with text wrapping-->
                <ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="FirstListBox_SelectionChanged" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                          <StackPanel Margin="0,0,0,17" Width="432">
                                <TextBlock Text="{Binding Title}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock Text="{Binding Intro}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                          </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </controls:PivotItem>

開始分析,Let go...

這段代碼實現的功能:將資訊綁定到Listbox控制項,當資料來源資訊發生改變時,頁面上展示的資訊也跟著改變。(功能簡單吧,主要介紹“委託”、“事件”和“介面”)

一、“INotifyPropertyChanged”介面(Interface)

     // Summary:
    //     Notifies clients that a property value has changed.
    public interface INotifyPropertyChanged
    {
        // Summary:
        //     Occurs when a property value changes.
        event PropertyChangedEventHandler PropertyChanged;
    }

     “介面”就是一套標準,然後由“實作類別”實現其中具體的方法,可以理解為一組抽象類別。任何類只要實現了這個介面,也就是實現了“PropertyChanged”方法,就可以“做一些事情”。“這些事情”就是指類屬性的改變觸發些事件。

      注意:這裡的“任何類”都去繼承它,它們都有相同的功能要實現,這樣大家都保持了一致。而不是每個人都聲明自己的,這樣就保證了正常化,要變大家一起變,“介面”的優勢,你也可以理解為“模組對接標準”。

二、委託(delegate)

      在介面中已經看到"PropertyChangedEventHandler",對它就是一個委託,看看它的定義。

      public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

      當你在一個方法中要調用另一個方法,而它們又不在一個“類”下,甚至不在同一個命名空間下。又或者說你要在一個方法中調用一批方法,這批方法的方法體相似,只有一些屬性變數不同。這是笨方法就是使用條件或是枚舉進行判斷,這樣如果又有新的方法加入了怎麼辦,從新修改判斷語句???這就牽扯到項目的可擴充了。這是怎麼辦比較好呢?把這些方法作為參數直接傳入目標方法中,也就是大家說的“將方法作為方法的參數”。

      既然方法成了參數,那麼參數應該有“參數類型”吧,用於規定方法代表的參數的種類。就像“String” 類型的參數。  這種“方法”型別參數的定義者就是“委託”。委託其實是一個類,雖然定義方法像定義方法似地,所以才可以定義類型嗎。編譯的時候就變為類了,也正是因為它是一個類,所以才可以在所有聲明類的地方聲明委託,也就是可以在命名空間裡直接聲明委託。

      這樣就可以直接將方法作為參數傳入另一個方法裡面了,在方法裡面只要調用“參數”,就可以調用傳入的“方法”。不用在糾結於執行方法的判斷了,傳什麼咱就執行什麼。

     既然“委託”是類型,那麼你自然就可以使用它定義變數了。

     比如:這時有兩個類,一個“Manager”,一個“Employ”,要在“Manager”中調用“Employ”中的方法怎麼辦?這時可以聲明一個委託“ManagerDelegate”,然後使用這個委託定義一個變數“delegate”,然後把“Employ”中的方法賦值給“deleegate”,再把“delegate”傳入“Manager”方法即可。是不是和使用類型的變數方式一樣,只不過在委託中一個變數不只可以賦值“一個方法”,還可以“綁定”更多的方法。第一個要賦值“=”,以後綁定“+=”,去除“-=”。

      試想,如果我們將“delegate”,變數放入"Manager"類中會怎麼樣?

      加上判斷if(delegate!=null){ delegate() //調用委託方法}else{},直接執行“委託定義的變數:delegate”了,那麼這個“deltegate”還有個名字你知道就什麼嗎?  猜對了,就是“事件”。

三:事件(Event)

      在變數“delegate”,變身“事件”之前,還要增加一個“Event”關鍵子,以增強封裝性。

      一句話,事件是一個進行了封裝的委託類型的變數。

      這也就是“event PropertyChangedEventHandler PropertyChanged;”中“event”的來曆。

總之:介面是“模組對接”標準,要變大家一起變。委託是把“方法”作為參數,對應的參數類型。事件是委託類型定義的再經過“event”封裝的變數。

這隻是在下鄙陋的理解和看法,肯定有很多不當的地方,還請大家多多指教。

還沒有介紹整體的實現流程和.net實現機制,關於這些內容將會在下面作介紹,敬請關注。

擴充資源

      

       

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.