WP8为LongListSelector根据Item内容选择ItemTemplate

我们知道Win8里要使ListView根据Item内容选择DataTemplate时,可以使用DataTemplateSelector类,但WP8里没有这个类可用。

所以,首先我们模仿实现一个DataTemplateSelector:

public abstract class DataTemplateSelector : ContentControl
	{
		//根据newContent的属性,返回所需的DataTemplate
		public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
		{
			return null;
		}

		protected override void OnContentChanged(object oldContent, object newContent)
		{
			base.OnContentChanged(oldContent, newContent);
			//根据newContent的属性,选择对应的DataTemplate
			ContentTemplate = SelectTemplate(newContent, this);
		}
	}

接着,我们继承DataTemplateSelector定义一个实际使用到的TemplateSelector:
public class StockTemplateSelector : DataTemplateSelector
	{
		public DataTemplate Normal { get; set; }
		public DataTemplate TS { get; set; }
		public DataTemplate KLine { get; set; }

		//根据newContent的属性,返回所需的DataTemplate
		public override DataTemplate SelectTemplate(object item, DependencyObject container)
		{
			StockItem stockItem = item as StockItem;
			if (stockItem != null)
			{
				if (stockItem.DisplayType == 1)
					return TS;
				else if (stockItem.DisplayType == 2)
					return KLine;
				else
					return Normal;
			}
			return base.SelectTemplate(item, container);
		}
	}

最后,在xaml里实现TemplateSelector里的每个模版,并赋给LongListSelector的ItemTemplate:

<phone:LongListSelector.ItemTemplate>
				<DataTemplate>
					<local:StockTemplateSelector Content="{Binding}">
						<local:StockTemplateSelector.Normal>
							<DataTemplate>
								<Border Style="{StaticResource DZHBorderStyle1}">
									<Grid>
										<Grid.ColumnDefinitions>
											<ColumnDefinition Width="2*"/>
											<ColumnDefinition Width="1*"/>
											<ColumnDefinition Width="2*"/>
										</Grid.ColumnDefinitions>
										<StackPanel Grid.Column="0" Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
											<TextBlock Text="{Binding StockName}" Foreground="Black" FontSize="20"/>
											<TextBlock Text="{Binding StockCode}" Foreground="Black" FontSize="20"/>
										</StackPanel>
										<TextBlock Grid.Column="1" Text="{Binding Latest}" Foreground="Black" FontSize="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
										<Button Grid.Column="2" Content="{Binding Percent}" Background="{Binding PercentColor}"
									FontSize="25" BorderBrush="Black" BorderThickness="1"/>
									</Grid>
								</Border>
							</DataTemplate>
						</local:StockTemplateSelector.Normal>
						<local:StockTemplateSelector.TS>
							<DataTemplate>
								<Border Style="{StaticResource DZHBorderStyle1}" Background="Green">
									<Grid>
										<TextBlock Text="{Binding StockName}" Foreground="White" FontSize="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
									</Grid>
								</Border>
							</DataTemplate>
						</local:StockTemplateSelector.TS>
						<local:StockTemplateSelector.KLine>
							<DataTemplate>
								<Border Style="{StaticResource DZHBorderStyle1}" Background="Red">
									<Grid>
										<TextBlock Text="{Binding StockName}" Foreground="White" FontSize="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
									</Grid>
								</Border>
							</DataTemplate>
						</local:StockTemplateSelector.KLine>
					</local:StockTemplateSelector>
				</DataTemplate>
			</phone:LongListSelector.ItemTemplate>

这样,就能根据每个StockItem元素的DisplayType属性选择不同的DataTemplate了。

你可能感兴趣的:(WP8为LongListSelector根据Item内容选择ItemTemplate)