您的位置:首页 > 其它

WP8为LongListSelector根据Item内容选择ItemTemplate

2013-01-23 17:19 316 查看
我们知道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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: