Кажется, я не могу установить 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 может полагаться на его существование).
Мы будем очень благодарны за любую помощь по отображению поля со списком с другим раскрывающимся списком и выбранным шаблоном!





Вы можете добиться этого с помощью всего ItemsContainerStyle. Добавьте свой TextBlock и Image вместо ContentPresenter. Добавьте VisualStateManager и переключите видимость элемента управления Image в зависимости от выбранного состояния VSM.
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. Вам необходимо:
Это эффективно игнорирует 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>
В чем тогда смысл ItemTemplate, а также, не приведет ли отсутствие ContentPresenter к потенциальной проблеме?