上文No DataType in DataTemplate in Windows Phone(—)中我們說到Windows Phone中有些特性被limited,如DataTemplate中的DataType,其實不只DataType,DataTemplate中的Trigger也不被支援。我們這篇文章從實際代碼開始分析。
看WPF的寫法:
<Window.Resources> <local:Company x:Key="dataCompany" /> <DataTemplate DataType="{x:Type local:User}" > <StackPanel Orientation="Horizontal" > <TextBlock Text="{Binding UserID}" x:Name="userid"/> <TextBlock Text=" Name: "/> <TextBlock Text="{Binding UserName}" /> </StackPanel> <DataTemplate.Triggers> <DataTrigger Binding="{Binding UserID}" Value="2"> <Setter TargetName="userid" Property="Foreground" Value="Red" /> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> <local:Company x:Key="UserList" > <local:User UserID="1" UserName="pan" /> <local:User UserID="2" UserName="qiao" /> <local:User UserID="3" UserName="zhu" /> </local:Company></Window.Resources>
ListBox綁定代碼如下:
<ListBox Height="193" HorizontalAlignment="Left" Margin="49,81,0,0" Name="listBox1" VerticalAlignment="Top" Width="181" ItemsSource="{StaticResource UserList}" />我們看到ListBox中沒有使用ItemTemplate去綁定DataTemplate,而結果卻按我們要求的正常顯示,1.
注意:<DataTemplate DataType="{x:Type local:User}" > 此處要綁定的是User類而不是Company ,否則會顯示錯誤,只顯示類名。
圖1.
而在Windows Phone中DataTemplate 是沒有DataType的,也沒有Trigger屬性。OK,那我們如果想讓調用User類作Items控制項的Item時,想像WPF那樣讓它自動綁定怎麼辦呢?難道必須每個DataTemplate都要定義一個x:Key,然後每個ItemsCrontrol做一下綁定?
先看Windows Phone中的DataTemplate:
<DataTemplate x:Key="listDataTemplate"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding UserID}" /> <TextBlock Text=" Name: "/> <TextBlock Text="{Binding UserName}" /> </StackPanel> </DataTemplate>
ListBox綁定語句: ---此處綁定的是上級的DataContext
<ListBox ItemTemplate="{StaticResource listDataTemplate}" Height="296" HorizontalAlignment="Left" Margin="39,86,0,0" Name="listBox1" VerticalAlignment="Top" Width="251" ItemsSource="{Binding}" />
關於實現Windows Phone中實現DataType類似的綁定的辦法,見
Applying Data Templates Dynamically by Type in WP7By
Florin Badea一文,英文的,Badea講解的很詳細及解決辦法