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.
Réponses
Trop de publicités?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.
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.
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