Wpf 如何在列表框中获取PreviewSelectionChanged事件之类的内容?

Wpf 如何在列表框中获取PreviewSelectionChanged事件之类的内容?,wpf,events,wpf-controls,Wpf,Events,Wpf Controls,当列表框选择即将更改时,我需要执行一些操作,但仍然选择了旧项。类似PreviewSelectionChanged的内容。WPF是否允许此类操作?我在列表框控件中找不到此类事件。您到底需要做什么?您通常可以在绑定属性中执行工作: <ListBox SelectedItem="{Binding SelectedItem}"/> public object SelectedItem { get { return _selectedItem; } set {

当列表框选择即将更改时,我需要执行一些操作,但仍然选择了旧项。类似PreviewSelectionChanged的内容。WPF是否允许此类操作?我在列表框控件中找不到此类事件。

您到底需要做什么?您通常可以在绑定属性中执行工作:

<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");
        }
    }
}

公共对象SelectedItem
{
获取{return\u selectedItem;}
设置
{
如果(_selectedItem!=值)
{
//在这里使用_selectedItem进行更改前的一些工作
_选择editem=值;
OnPropertyChanged(“SelectedItem”);
}
}
}

当然,如果要绑定到依赖项属性,则应用相同的主体。
DependencyPropertyChanged
处理程序提供新旧值。

以下是如何从selection changed事件中获取旧项

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;
}

希望这就是你想要的。

答案不太完整,我找到的解决方案是:

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

谢谢你的回答。这只是我目标的一部分,另一部分是防止在某些情况下改变选择。好的,我认为可以检查事件处理程序中的一些条件并自动恢复旧的选择。问题是,如果您更改代码中的选择,它将触发另一个SelectionChanged事件。