Domanda

Sto affrontando un problema mentre lavoro con un ComboBox WPF . La mia situazione è che ho un ComboBox che mostra alcuni valori. Sto aggiungendo ContentControl alla proprietà Items di ComboBox. Ho associato il Content di questi ContentControl ad alcune origini dati in modo da poter cambiare il contenuto in modo dinamico. Il problema è se il contenuto dell'elemento selezionato modifica l'elemento nel menu a discesa ComboBox si aggiorna ma l'elemento in ComboBox SelectionChange rimane lo stesso.

Qualche suggerimento per favore?

È stato utile?

Soluzione 2

Ho risolto questo problema in modo diverso.
ComboBox SelectedItem non è ciò che visualizza ma è ciò che selezioni. Quando si seleziona un oggetto comboBox prende il ComboBox lo visualizza nel modello di SelectionBox non nel modello di SelectedItem. Se entrerai in VisualTree di ComboBox, vedrai che ha un ContentPresenter che contiene un TextBlock e questo TextBlock è assegnato con il testo dell'elemento selezionato.
Quindi, cosa ho fatto, nel gestore di eventi SelectionChanged ho cercato TextBlock all'interno di ContentPresenter usando VisualTreeHelper e poi ho associato la proprietà Text di questo TextBlock alla proprietà Content di ContentControl (SelectedItem).

Modifica:

Nel gestore evetn di SelectionChanged di ComboBox ho scritto:

ModifyCombox(cmbAnimationBlocks, myComboBox.SelectedItem.As<ContentControl>());

e questo metodo è:

    private static void ModifyCombox(DependencyObject comboBox, ContentControl obj)
    {
        if (VisualTreeHelper.GetChildrenCount(comboBox) > 0)
        {
            WalkThroughElement(comboBox, obj);
        }
    }

    private static void WalkThroughElement(DependencyObject element, ContentControl contentControl)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            if (element.GetType() == typeof(ContentPresenter))
            {
                ContentPresenter contentPresenter = element.As<ContentPresenter>();
                TextBlock textBlock = VisualTreeHelper.GetChild(contentPresenter, 0).As<TextBlock>();
                textBlock.SetBinding(TextBlock.TextProperty, new Binding("Content")
                {
                    Source = contentControl
                });
                contentPresenter.Content = textBlock;
            }
            else
            {
                DependencyObject child = VisualTreeHelper.GetChild(element, i).As<FrameworkElement>();
                WalkThroughElement(child, contentControl);
            }
        }

        if (VisualTreeHelper.GetChildrenCount(element) == 0 && element.GetType() == typeof(ContentPresenter))
        {
            ContentPresenter contentPresenter = element.As<ContentPresenter>();
            TextBlock textBlock = new TextBlock();
            textBlock.SetBinding(TextBlock.TextProperty, new Binding("Content")
            {
                Source = contentControl
            });
            contentPresenter.Content = textBlock;
        }
    }

Altri suggerimenti

Invece di aggiungere ContentControl direttamente all'interno del ComboBox, utilizzare un DataTemplate (ItemsTemplate) o ItemContainerStyle. Perché ComboBoxItem generato automaticamente non conosce il tuo clic perché ContentControl recupera Mousedown e nasconde ComboboxItem. L'elemento ComboBox è responsabile dell'impostazione di IsSelectedProperty e dell'attivazione di SelectionChanged.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top