12
votes

Sélection d'une listeBoxItem lorsque sa combinaison interne est concentrée

J'ai un datatemplate qui sera un fichier ListboxItem, ce type de données a un Combobox dans celui qui, quand il a focus, je veux la listeBoxItem que ce modèle Représente de devenir sélectionnée, cela me dirige bien. mais assez tristement, il ne fonctionne pas = (

La vraie question ici est dans un ensemble de données est possible d'obtenir ou de définir la valeur de la propriété listboxItem.isselected via un datatemplate.trigger ? xxx


0 commentaires

3 Réponses :


9
votes

J'ai trouvé une solution pour votre problème.

Le problème est que lorsque vous avez un contrôle sur votre ListboxItem, et le contrôle est cliqué sur la saisie de texte ou de modifier la valeur d'une combinaison), la listeBoxItem ne fait pas Obtenez sélectionné. P>

Ceci devrait faire le travail: P>

public class FocusableListBoxItem : ListBoxItem
{
    public FocusableListBoxItem()
    {
        GotFocus += new RoutedEventHandler(FocusableListBoxItem_GotFocus);
    }


    void FocusableListBoxItem_GotFocus(object sender, RoutedEventArgs e)
    {
        object obj = ParentListBox.ItemContainerGenerator.ItemFromContainer(this);
        ParentListBox.SelectedItem = obj;
    }

    private ListBox ParentListBox
    {
        get
        {
            return (ItemsControl.ItemsControlFromItemContainer(this) as ListBox);
        }
    }

}


2 commentaires

Résolu mon problème. J'étais en fait assez soulevé sur celui-ci. approche intéressante de la solution. Je suis assez curieux s'il y a un moyen de le faire à xaml?


Aucune idée si elle est possible dans xaml. Je suis content que cela fonctionne simplement dans le code :)



0
votes

aucune idée de la raison pour laquelle votre déclencheur ne fonctionne pas. Pour attraper l'événement de mise au point d'obtention de la liste déroulante (ou de tout contrôle à l'intérieur d'une liste de liste), vous pouvez utiliser des événements routés ci-joints. Vous pouvez également mettre le code dans une liste dérivée si vous avez besoin de ce comportement dans d'autres parties de votre application.

xaml: p> xxx pré>

code derrière l'accrochage Événements. P>

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace RoutedEventDemo
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            EventManager.RegisterClassHandler(typeof(UIElement),
                                              GotFocusEvent,
                                              new RoutedEventHandler(OnGotFocus));
        }

        private static void OnGotFocus(object sender, RoutedEventArgs e)
        {
            // Check if element that got focus is contained by a listboxitem and
            // in that case selected the listboxitem.

            DependencyObject parent = e.OriginalSource as DependencyObject;
            while (parent != null)
            {
                ListBoxItem clickedOnItem = parent as ListBoxItem;
                if (clickedOnItem != null)
                {
                    clickedOnItem.IsSelected = true;
                    return;
                }

                parent = VisualTreeHelper.GetParent(parent);
            }
        }
    }
}


0 commentaires

9
votes

J'ai trouvé que j'ai préféré utiliser ceci: xxx

simple et fonctionne pour tous les ListboxItems, quel que soit ce qui se trouve à l'intérieur.


2 commentaires

Votre réponse a été utile à chaque fois que j'ai eu ce problème. Mais maintenant, j'ai un bouton Supprimer sur la liste de ListboxItM qui est concentable = FALSE. Dans ce cas lorsque vous cliquez sur ce bouton sur ce bouton, l'ancien sélection de sélection est supprimé au lieu de la sélection de l'élément sur lequel la touche DELETE a été cliquée, puis supprimez-la.


Votre réponse fonctionne, mais après avoir cliqué sur un bouton ou tout autre contrôle, mon index sélectionné réinitialise à -1