Как использовать другой шаблон для выбранных и раскрывающихся состояний в поле со списком в Silverlight?

Кажется, я не могу установить ContentTemplate для ComboBoxItem. Причина, по которой я пытаюсь это сделать, заключается в том, что я хочу, чтобы мои данные отображались дважды в поле со списком. Когда поле со списком открыто (меню вниз), мне нужно текстовое поле (с именем изображения) и элемент управления изображением под ним. Когда я выбираю элемент, я хочу, чтобы в поле со списком отображалось только текстовое поле с именем изображения.

Я думал, что смогу добиться этого, изменив ItemTemplate и ItemContainerStyle ComboBox. ItemContainerStyle содержит следующий ContentPresenter:

<ContentPresenter HorizontalAlignment = "Left" Margin = "{TemplateBinding Padding}" x:Name = "contentPresenter" Content = "{TemplateBinding Content}" ContentTemplate = "{TemplateBinding ContentTemplate}"/>

Поэтому я предположил, что могу просто установить здесь ContentTemplate, и он сработает. Но я не могу заставить его работать:

<DataTemplate x:Key = "ComboBoxDataTemplate">
            <Grid>
                <TextBlock Text = "{Binding Path='Name'}"/>
            </Grid>
        </DataTemplate>

<DataTemplate x:Key = "ComboBoxItemTemplate">
            <StackPanel>
                <TextBlock Text = "{Binding Path='Name'}"/>
                <Image Source = "{Binding Path='Source'}" Width = "64" Height = "64"/>
            </StackPanel>
        </DataTemplate>

        <Style x:Key = "ComboBoxItemStyle1" TargetType = "ComboBoxItem">
...
            <Setter Property = "ContentTemplate" Value = "{StaticResource ComboBoxItemTemplate}"/>

...

Вот мой комбинированный список:

<ComboBox Width = "70" Margin = "3,0,0,0"
                        ItemsSource = "{StaticResource Source}"
                        ItemTemplate = "{StaticResource ComboBoxDataTemplate}"
                        ItemContainerStyle = "{StaticResource ComboBoxItemStyle1}"
                        />

Единственный способ заставить это работать - удалить ContentPresenter из ItemContainerStyle и заменить его содержимым моего настраиваемого шаблона (ComboBoxItemTemplate). Но я не думал, что должен использовать этот подход, поскольку это будет означать, что ContentPresenter больше не существует (и код в ComboBox может полагаться на его существование).

Мы будем очень благодарны за любую помощь по отображению поля со списком с другим раскрывающимся списком и выбранным шаблоном!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
4 376
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете добиться этого с помощью всего ItemsContainerStyle. Добавьте свой TextBlock и Image вместо ContentPresenter. Добавьте VisualStateManager и переключите видимость элемента управления Image в зависимости от выбранного состояния VSM.

В чем тогда смысл ItemTemplate, а также, не приведет ли отсутствие ContentPresenter к потенциальной проблеме?

Mark Ingram 07.11.2008 17:31

DataTemplate в основном предназначен для визуализации ваших данных. Лучше предоставить всю динамику, связанную с пользовательским интерфейсом, внутри ControlTemplate (поведение управления). Если у вас нет ContentPresenter, потенциальных проблем не возникнет. Единственная проблема заключается в том, что если вы хотите повторно использовать этот ControlTemplate из другого ComboBox. Затем вы можете объявить там еще один чистый шаблон Control с ContentPresenter.

Ответ принят как подходящий

ComboBox.ItemTemplate - это просто удобный способ установить ComboBoxItem.ContentTemplate. Итак, ваш код выше в основном пытается установить ComboBoxItem.ContentTemplate дважды.

Как указал Джоби, вы можете попробовать использовать только собственный стиль. Вы можете безопасно исключить ContentPresenter, если вы всегда знаете тип Content. ContentPresenter просто позволяет использовать DataTemplate для отображения некоторых случайных данных. Но вы можете просто заменить его на TextBlock и Image. Вы просто теряете возможность указать DataTemplate.

Проблема с подходом Jobi заключается в том, что выбранный элемент не отображает его изображение, даже если оно находится в раскрывающемся списке. На самом деле выбранный элемент отображается в двух местах (раскрывающийся список и основная часть ComboBox). В одном месте вам нужен один DataTemplate, а в другом - другой.

Лучше всего изменить стиль ComboBox. Вы можете получить стиль по умолчанию из здесь. Существует ContentPresenter с именем ContentPresenter. Вам необходимо:

  1. Удалите / измените имя ContentPresenter, поэтому ComboBox не будет автоматически устанавливать свойства Content / ContentTemplate.
  2. Свяжите свойство ContentPresenter.Content следующим образом: "{TemplateBinding SelectedObject}"
  3. Установите для свойства ContentPresenter.ContentTemplate свой DataTemplate без Image
  4. Установите для свойства ComboBox.ItemTemplate значение DataTemplate с помощью Image и TextBlock, как если бы вы были
  5. Дайте стилю ComboBox явный ключ, например x: Key = "MyComboBoxStyle"
  6. Используйте стиль в своем ComboBox, например Style = "{StaticResource MyComboBoxStyle}"

Это эффективно игнорирует ComboBoxItem.ContentTemplate при отображении выбранного элемента в теле ComboBox, но использует его при отображении ComboBoxItem в раскрывающемся списке.

Действительно полезно. Спасибо. Просто чтобы прояснить, как я боролся с тем, чем заменить SelectedObject, хотя теперь это кажется очевидным. Мой фрагмент кода для ContentPresenter выглядит так: <ContentPresenter x: Name = "ContentPresenterRenamedHack" ... Content = "{TemplateBinding SelectedItem}"> <ContentPresenter.ContentTemplate> <DataTemplate> <TextBlock Text = "{Binding GradeValue, StringFormat = \ {0: n0 \}} "/> </DataTemplate> </ContentPresenter.C‌ ontentTemplate> </ContentPresenter>

dev.bv 17.10.2011 20:10

Другие вопросы по теме