Не все ListBoxItem созданы равными - PullRequest
1 голос
/ 04 сентября 2010

В следующем примере DataTemplate применяется только к первому и второму элементу списка, третий и четвертый полностью игнорируются.

<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; Тип = 'ListBoxItem'.

Итак, я понимаю, почему мои шаблоны не применяются, но почему WPF становится все неприятнее, когда я явно использую объекты ListBoxItems в своих элементах списка? Я имею в виду, что WPF неявно размещает ALL элементов в объекте ListBoxItems, так почему же WPF не может просто поблагодарить меня за то, что я выполнил часть работы, которую он должен делать, а не выдать ошибку? :)

Спасибо.

1 Ответ

2 голосов
/ 04 сентября 2010

Это больше похоже на предупреждение, чем на ошибку - просто объясняю, почему ваши объявленные ItemTemplate и ListBoxItem s не будут работать вместе.

edit

В ответ на ваш комментарий рассмотрим следующее:

    <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 определяет способ отображения типа элемента.Для элементов «Один» и «Два», которые являются строками, ItemTemplate определяет, как отобразить это, а переносит результат в ListBoxItem.

Если, однако, предмет уже a ListBoxItem

  1. Это не тот предмет, с которым ItemTemplate обязательно может иметь дело, потому что ItemTemplate является DataTemplate и
  2. ListBoxItem может определять свои собственные свойства, стиль и шаблон.

Итак, если вы явно создаете ListBoxItem s, я думаю, что этолучше, чтобы WPF уважал возможность настраивать стиль этого элемента, а не переопределял все это с помощью ItemTemplate.

В этом прелесть использования ItemTemplates - вы можете использовать их, смешивать, сопоставлять,и искалечить их, обычно не беспокоясь о ListBoxItem.Единственный раз, когда мне приходилось иметь дело с ListBoxItem напрямую, - это когда я создаю для него стиль - декларирование его как элемента в явном виде, вероятно, в лучшем случае редкий случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...