void UpdateDisplayedItem (object selectedItem)
{
object content;
// Can't do anything with no content presenter
if (_contentPresenter == null)
return;
// Return the currently displayed object (which is a UIElement)
// to its original container.
if (DisplayedItem != null) {
content = _contentPresenter.Content;
DisplayedItem.Content = content;
DisplayedItem = null;
}
_contentPresenter.Content = null;
if (selectedItem == null) {
_contentPresenter.Content = NothingSelectedFallback;
_contentPresenter.ContentTemplate = null;
SelectionBoxItem = null;
SelectionBoxItemTemplate = null;
return;
}
// If the currently selected item is a ComboBoxItem (not ListBoxItem!), we
// display its Content instead of the CBI itself.
content = selectedItem;
if (content is ComboBoxItem)
content = ((ComboBoxItem) content).Content;
// Only allow DisplayedItem to be non-null if we physically move
// its content. This will only happen if DisplayedItem == SelectedItem
DisplayedItem = ItemContainerGenerator.ContainerFromIndex (SelectedIndex) as ComboBoxItem;
SelectionBoxItem = content;
SelectionBoxItemTemplate = ItemTemplate;
// If displayed item is avaiable, we can get the right template from there. Otherwise
// we need to create a container, read the template and destroy it.
if (DisplayedItem != null) {
SelectionBoxItemTemplate = DisplayedItem.ContentTemplate;
if (content is UIElement)
DisplayedItem.Content = null;
else
DisplayedItem = null;
} else {
bool fresh;
ComboBoxItem container = ItemContainerGenerator.ContainerFromIndex (SelectedIndex) as ComboBoxItem;
if (container == null) {
var index = ItemContainerGenerator.GeneratorPositionFromIndex (SelectedIndex);
using (ItemContainerGenerator.StartAt (index, GeneratorDirection.Forward, true))
container = ItemContainerGenerator.GenerateNext (out fresh) as ComboBoxItem;
ItemContainerGenerator.PrepareItemContainer (container);
}
SelectionBoxItemTemplate = container.ContentTemplate;
}
_contentPresenter.Content = SelectionBoxItem;
_contentPresenter.ContentTemplate = SelectionBoxItemTemplate;
}