園子裡有很多講“委託”,“事件”和“介面”的文章,好文章有很多。在這片文章裡將結合“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實現機制,關於這些內容將會在下面作介紹,敬請關注。
擴充資源