2

XAML 自体で宣言された ListBoxItems が DataTemplate の影響を受けないのはなぜですか? ソースをバインドするときのテンプレートは問題ありません。それが最終的に行うことですが、宣言されたアイテムがスタイルされていない理由が不思議です。

<ListBox>
     <ListBox.ItemTemplate>
         <DataTemplate>
             <Grid>
                 <TextBlock Text="{Binding}" Foreground="Red"/>
             </Grid> 
         </DataTemplate>                   
     </ListBox.ItemTemplate>
     <ListBoxItem>LBI 1</ListBoxItem>
     <ListBoxItem>LBI 2</ListBoxItem>
</ListBox>

ここで LBI 1 と LBI 2 は赤ではありませんが、ListBox.ItemSource を使用してリストをバインドすると、アイテムは赤になります。

4

3 に答える 3

3

"ItemsControl に ItemTemplate を設定すると、UI は次のように生成されます (例として ListBox を使用)。

  1. コンテンツの生成中に、ItemsPanel は、ItemContainerGenerator に対する要求を開始して、各データ項目のコンテナーを作成します。ListBox の場合、コンテナーは ListBoxItem です。ジェネレーターは、コンテナーを準備するために ItemsControl を呼び出します。

  2. 準備の一部として、ListBox の ItemTemplate をコピーして ListBoxItem の ContentTemplate にする必要があります。

  3. すべての ContentControl タイプと同様に、ListBoxItem の ControlTemplate には ContentPresenter が含まれています。テンプレートが適用されると、ContentTemplate が ListBoxItem の ContentTemplate にバインドされている ContentPresenter が作成されます。

  4. 最後に、ContentPresenter がその ContentTemplate を自分自身に適用し、UI を作成します。」

上記のように、datatemplate は新しく生成されたアイテムにのみ使用されます。また、データテンプレートは通常、データの「視覚的構造」を記述/提示するために使用されます-ListBoxItemsはすでにListBoxItemsとして記述されているため、そのテンプレートを使用します...これが理にかなっていることを願っています...

于 2013-08-10T15:56:27.930 に答える
2

申請が必要ですStyle。listBox にバインドされているDataTemplateテンプレートを適用するために使用されます。Dataしたがって、XAML 内で子として直接追加されるアイテムには適用されません。

    <ListBox>
        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Foreground" Value="Red"/>
            </Style>
        </ListBox.Resources>
        <ListBoxItem>LBI 1</ListBoxItem>
        <ListBoxItem>LBI 2</ListBoxItem>
    </ListBox>
于 2013-08-10T15:28:23.580 に答える
2

例の LB1 と LB2 はデータ テンプレートの一部ではないためです。ListBox の ItemsSource にデータをバインドすると、それらの項目はデータ テンプレートに従って表示されます。

于 2013-08-10T15:26:29.873 に答える