3 votes

Comment obtenir quelque chose comme l'événement PreviewSelectionChanged dans une ListBox ?

J'ai besoin d'effectuer certaines actions lorsque la sélection de la boîte de liste est sur le point de changer, mais que l'ancien élément est toujours sélectionné. Quelque chose comme PreviewSelectionChanged. Est-ce que WPF permet une telle opération ? Je ne peux pas trouver un tel événement dans le contrôle ListBox.

2voto

Tri Q Points 2661

Voici comment récupérer l'ancien élément à partir de l'événement de modification de la sélection.

private void ListBox_SelectionChanged(object sender , SelectionChangedEventArgs e)
{
    // Here are your old selected items from the selection changed.
    // If your list box does not allow multiple selection, then just use the index 0
    // but making sure that the e.RemovedItems.Count is > 0 if you are planning to address by index.
    IList oldItems = e.RemovedItems;

    // Do something here.

    // Here are you newly selected items.
    IList newItems = e.AddedItems;
}

J'espère que c'est ce que vous cherchez.

1voto

Kent Boogaart Points 97432

Que devez-vous faire exactement ? En principe, vous pouvez simplement effectuer votre travail dans la propriété liée :

<ListBox SelectedItem="{Binding SelectedItem}"/>

public object SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (_selectedItem != value)
        {
            // do some work before change here with _selectedItem

            _selectedItem = value;
            OnPropertyChanged("SelectedItem");
        }
    }
}

Bien sûr, si vous vous liez à une propriété de dépendance, le même principe s'applique. L'adresse DependencyPropertyChanged vous donne les anciennes et les nouvelles valeurs.

1voto

GameAlchemist Points 7905

La réponse n'est pas tout à fait complète, la solution que j'ai trouvée est :

Private NextSelectionChangedIsTriggeredByCode As Boolean = False
Private Sub MyListView_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
    If NextSelectionChangedIsTriggeredByCode Then
        NextSelectionChangedIsTriggeredByCode = False
        Return
    End If
    If   ... Some reason not to change the selected item ...  Then
        Dim MessageBoxResult = MessageBox.Show("Changes were made and not saved. Continue Anyway ?", "Unsaved Changes", MessageBoxButton.OKCancel)
        If MessageBoxResult = MessageBoxResult.Cancel Then
            NextSelectionChangedIsTriggeredByCode = True
            MyListView.SelectedIndex = MyListView.Items.IndexOf(e.RemovedItems(0))
            Return
        End If
    End If

... Code to execute when selection could change ...

    e.Handled = True
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X