1

以下の例では、DataTemplateは1番目と2番目のリスト項目にのみ適用され、3番目と4番目は完全に無視されます。

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding}"></Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <sys:String>One</sys:String>
    <sys:String>Two</sys:String>
    <ListBoxItem>Three</ListBoxItem>
    <ListBoxItem>Four</ListBoxItem>
</ListBox>

私の質問はなぜですか?

出力ウィンドウを見ると、次のエラーが表示されます。「ItemTemplateとItemTemplateSelectorは、ItemsControlのコンテナタイプがすでに存在するアイテムでは無視されます。Type='ListBoxItem'。

それで、テンプレートが適用されない理由がわかりますが、リストアイテムでListBoxItemsオブジェクトを明示的に使用すると、WPFがすべて厄介になるのはなぜですか?つまり、WPFはListBoxItemsオブジェクト上のすべてのアイテムを暗黙的にホストしているので、エラーをスローするのではなく、WPFが実行するはずの作業の一部を実行してくれたことに感謝できないのはなぜですか?:)

ありがとうございました。

4

1 に答える 1

2

エラーというよりは警告のように聞こえます。宣言されたものItemTemplateListBoxItemsが連携しない理由を入力するだけです。

編集

あなたのコメントに応えて、次のことを考慮してください:

    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Items>
            <System:String>One</System:String>
            <System:String>Two</System:String>
            <ListBoxItem Background="Red">Three</ListBoxItem>
            <ListBoxItem>
                <ListBoxItem.Template>
                    <ControlTemplate>
                        <Button Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" 
                                Background="Blue"
                                Foreground="White"
                                />
                    </ControlTemplate>
                </ListBoxItem.Template>
                <ListBoxItem.Content>
                    Four
                </ListBoxItem.Content>
            </ListBoxItem>
        </ListBox.Items>
    </ListBox>

ItemTemplateアイテムタイプを表示する方法を定義するものと考えてください。文字列であるアイテム「One」と「Two」の場合、ItemTemplateはそれを表示する方法を定義し、結果を。でラップしListBoxItemます。

ただし、アイテムがすでにListBoxItem

  1. これは、がItemTemplateであるため、必ずしも処理できるアイテムではありません。ItemTemplateDataTemplate
  2. ListBoxItem、独自のプロパティ、スタイル、およびテンプレートを定義できます。

したがって、明示的にListBoxItemsを作成する場合は、すべてを。でオーバーライドするのではなく、WPFがそのアイテムのスタイルをカスタマイズする機能を尊重する方がよいと思いますItemTemplate

それが使用の美しさです。ItemTemplates通常、実際に心配することなく、それらを使用、混合、一致、およびマングルすることができますListBoxItem。私が直接対処しなければならなかったのListBoxItemは、そのスタイルを作成するときだけです。1つをアイテムとして明示的に宣言することは、せいぜいまれなケースです。

于 2010-09-04T18:12:45.297 に答える