【问题标题】:ListBox with multiple ItemTemplates in Windows Phone 8Windows Phone 8 中具有多个 ItemTemplate 的 ListBox
【发布时间】:2012-12-28 20:43:19
【问题描述】:

我有一个 ListBox,它是一个对话气泡列表(如消息应用程序),每个对话气泡都可以来自用户或系统。因此,在资源中定义的列表框有两个 DataTemplates。如何有选择地将这些应用到 ListBox?

我尝试了 DataTemplateSelector(这是 WP7 的解决方案,但我在 WP8 中找不到该类!),使用(WP8 不支持 DataType),最后是 ItemTemplate 属性上的 IValueConvertor - 全部为否有用!

这样做的方法是什么?我想一定有办法,因为这是一个相当简单的要求?!

谢谢

【问题讨论】:

    标签: c# xaml windows-phone-8


    【解决方案1】:

    DataTemplateSelector 是根据 XAML 数据绑定中的项目类型更改 ItemTemplates 的推荐方法。 DataTemplateSelector 不是 WP7 内置的,也不是 WP8 内置的。你必须在网上找到一个你喜欢的DataTemplateSelector 并使用它。或者只是自己动手,因为它大约有 5-10 行代码。

    custom DataTemplateSelectors in WP7 上有一篇关于WindowsPhoneGeek 的好文章,而wp7nl 项目基于该文章的DataTemplateSelector base class

    <ListBox x:Name="listBox" HorizontalContentAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <local:FoodTemplateSelector Content="{Binding}">
                    <local:FoodTemplateSelector.Healthy>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Background="YellowGreen" Width="400" Margin="10">
                                <Image Source="{Binding IconUri}" Stretch="None"/>
                                <TextBlock Text="{Binding Name}" FontSize="40" Foreground="Black" Width="280"/>
                                <TextBlock Text="healty" />
                            </StackPanel>
                        </DataTemplate>
                        </local:FoodTemplateSelector.Healthy>
                    <local:FoodTemplateSelector.UnHealthy>
                        <DataTemplate>
                            <Border BorderBrush="Red" BorderThickness="2"  Width="400" Margin="10">
                            <StackPanel Orientation="Horizontal">
                                <Image Source="{Binding IconUri}" Stretch="None"/>
                                    <TextBlock Text="{Binding Name}" FontSize="40" Width="280"/>
                                <Image Source="Images/attention.png" Stretch="None" Margin="10,0,0,0"/>
                            </StackPanel>
                            </Border>
                        </DataTemplate>
                    </local:FoodTemplateSelector.UnHealthy>
                    <local:FoodTemplateSelector.NotDetermined>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Background="Gray" Width="400" Margin="10">
                                <Image Source="{Binding IconUri}" Stretch="None"/>
                                <TextBlock Text="{Binding Name}" FontSize="40" Width="280"/>
                                <Image Source="Images/question.png" Stretch="None" Margin="10,0,0,0"/>
                            </StackPanel>
                        </DataTemplate>
                    </local:FoodTemplateSelector.NotDetermined>
                </local:FoodTemplateSelector>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    如果您正在寻找更快速和肮脏的解决方案 Prism's DataTemplateSelector 不需要 C# 编码,因为它 uses the DataTemplateSelector.Resources collection to handle type mapping。两个DataTemplateSelector 类都可以复制出来并在您的应用程序中使用。

       1: <UserControl.Resources>
       2:     <DataTemplate x:Key="SelectorDataTemplate">
       3:         <prism:DataTemplateSelector Content="{Binding}"
       4:                                     HorizontalContentAlignment="Stretch"
       5:                                     IsTabStop="False">
       6:             <prism:DataTemplateSelector.Resources>
       7:                 <DataTemplate x:Key="DataType1">
       8:                     <StackPanel Orientation="Horizontal">
       9:                         <TextBlock Text="{Binding ID}"/>
      10:                         <toolkit:Separator />
      11:                         <TextBlock Text="{Binding Name}" />
      12:                     </StackPanel>
      13:                 </DataTemplate>
      14:  
      15:                 <DataTemplate x:Key="DataType2">
      16:                     <StackPanel Orientation="Horizontal">
      17:                         <TextBox Text="{Binding Index}" />
      18:                         <toolkit:Separator />
      19:                         <TextBox Text="{Binding Description}" />
      20:                     </StackPanel>
      21:                 </DataTemplate>
      22:  
      23:             </prism:DataTemplateSelector.Resources>
      24:         </prism:DataTemplateSelector>
      25:     </DataTemplate>
      26: </UserControl.Resources>
    

    还有更多DataTemplateSelectors,包括:Odyssey PhoneUIMessage 等。

    【讨论】:

    • 太棒了!我从未使用过 WP7 开发,所以我也不知道它不是内置的。我会在今天晚些时候试一试!希望有更好的 WP8 文档!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多