4

会話バブル(メッセージングアプリなど)のリストであるListBoxがあり、それぞれがユーザーまたはシステムのいずれかからのものである可能性があります。したがって、リソースで定義されているリストボックスには2つのDataTemplatesがあります。これらをリストボックスに選択的に適用するにはどうすればよいですか?

DataTemplateSelector(これはWP7のソリューションですが、WP8でクラスが見つかりません!)を使用して(DataTypeはWP8でサポートされていません)、最後にItemTemplateプロパティのIValueConvertorを試しました-すべて役に立ちませんでした!

これを行う方法は何ですか?かなり単純な要件なので、方法があるはずだと思いますか?!

ありがとう

4

1 に答える 1

12

DataTemplateSelectorItemTemplatesXAML データバインディングの項目タイプに基づいて変更する方法として推奨されます。DataTemplateSelectorWP7 には組み込まれておらず、WP8 にも組み込まれていません。好きなバージョンをオンラインで見つけてDataTemplateSelector使用する必要があります。または、約 5 ~ 10 行のコードなので、自分で作成してください。

WP7 のカスタム DataTemplateSelectorsに関する WindowsPhoneGeek に関する良い記事と、その記事に基づいたDataTemplateSelector 基本クラスに基づく wp7nl プロジェクトがあります。

<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 の DataTemplateSelectorはDataTemplateSelector.Resources コレクションを使用して型マッピングを処理するため、C# コーディングは必要ありません。両方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>

Odyssey PhoneUIMessageDataTemplateSelectorsなど、他にもたくさんあります。

于 2012-12-29T01:04:59.283 に答える