这里来实现一个ListBox里面点击某项后 展示出它的选中项更多的数据
这时使用ExpanderView 来实现会非常简单
首先写实体类:
public class CustomPizza : INotifyPropertyChanged
{
private bool isExpanded;
public string Image { get; set; }
public string Name { get; set; }
public DateTime DateAdded { get; set; }
public IList<PizzaOption> Options { get; set; }
public bool HasNoOptions
{
get { return this.Options == null || this.Options.Count == 0; }
}
public bool IsExpanded
{
get { return this.isExpanded; }
set
{
if (this.isExpanded != value)
{
this.isExpanded = value;
this.OnPropertyChanged("IsExpanded");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public class PizzaOption
{
public string Name { get; set; }
}
创建Images文件夹并放入4张图片
写入数据
public MainPage()
{
List<CustomPizza> customPizzas = new List<CustomPizza>()
{
new CustomPizza()
{
Name = "Custom Pizza 1",
DateAdded = new DateTime(2010, 7, 8),
Image="Images/pizza1.png",
Options = new List<PizzaOption>
{
new PizzaOption() { Name = "Ham" },
new PizzaOption() { Name = "Mushrooms" },
new PizzaOption() { Name = "Tomatoes" }
}
},
new CustomPizza()
{
Name = "Custom Pizza 2",
DateAdded = new DateTime(2011, 2, 10),
Image="Images/pizza2.png",
Options = new List<PizzaOption>
{
new PizzaOption() { Name = "Ham" },
new PizzaOption() { Name = "Olives" },
new PizzaOption() { Name = "Mozzarella" }
}
},
new CustomPizza()
{
Name = "Surprise Pizza",
Image= null,
DateAdded = new DateTime(2011, 4, 1),
Options = null
},
new CustomPizza()
{
Name = "Custom Pizza 3",
Image="Images/pizza3.png",
DateAdded = new DateTime(2011, 5, 15),
Options = new List<PizzaOption>
{
new PizzaOption() { Name = "Salami" },
new PizzaOption() { Name = "Mushrooms" },
new PizzaOption() { Name = "Onions" } }
},
new CustomPizza()
{
Name = "Custom Pizza 4",
Image="Images/pizza4.png",
DateAdded = new DateTime(2011, 7, 20),
Options = new List<PizzaOption>
{
new PizzaOption() { Name = "Pepperoni" },
new PizzaOption() { Name = "Olives" },
new PizzaOption() { Name = "Mozzarella" }
}
},
};
//...
}
下面写前端页面,及数据跟UI的绑定
前面页面数据转换器:(比如08/08/2011年,我们即可以自动转换成文字"一个月以前")
<phone:PhoneApplicationPage.Resources>
<toolkit:RelativeTimeConverter x:Key="RelativeTimeConverter"/>
</phone:PhoneApplicationPage.Resources>
头部模板:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="CustomHeaderTemplate">
<TextBlock Text="{Binding Name}" FontSize="{StaticResource PhoneFontSizeExtraLarge}" FontFamily="{StaticResource PhoneFontFamilySemiLight}"/>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
下拉扩展列表模板
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="CustomExpanderTemplate">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Image}" Stretch="None"/>
<TextBlock Foreground="{StaticResource PhoneSubtleBrush}" FontSize="{StaticResource PhoneFontSizeNormal}" VerticalAlignment="Center">
<TextBlock.Text>
<Binding Path="DateAdded" Converter="{StaticResource RelativeTimeConverter}" StringFormat="Date added: {0}" />
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
每ListBox的Item 模板
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="CustomItemTemplate">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
有没下拉列表时显示的模板
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="CustomNonExpandableHeaderTemplate">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}" FontSize="{StaticResource PhoneFontSizeExtraLarge}" FontFamily="{StaticResource PhoneFontFamilySemiLight}"/>
<TextBlock Foreground="{StaticResource PhoneSubtleBrush}" FontSize="{StaticResource PhoneFontSizeNormal}">
<TextBlock.Text>
<Binding Path="DateAdded" Converter="{StaticResource RelativeTimeConverter}" StringFormat="Date added: {0}" />
</TextBlock.Text>
</TextBlock>
<TextBlock Text="The ingredients will be a surpise!" Foreground="{StaticResource PhoneSubtleBrush}"FontSize="{StaticResource PhoneFontSizeNormal}" />
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
这时添加一个ListBox
<ListBox Grid.Row="0" x:Name="listBox">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<toolkit:ExpanderView Header="{Binding}" Expander="{Binding}" ItemsSource="{Binding Options}" NonExpandableHeader="{Binding}"IsNonExpandable="{Binding HasNoOptions}" IsExpanded="{Binding IsExpanded, Mode=TwoWay}"HeaderTemplate="{StaticResource CustomHeaderTemplate}" ExpanderTemplate="{StaticResource CustomExpanderTemplate}"ItemTemplate="{StaticResource CustomItemTemplate}"NonExpandableHeaderTemplate="{StaticResource CustomNonExpandableHeaderTemplate}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
最后设置ListBox的ItemSource :this.listBox.ItemsSource = customPizzas;