从绑定的ObservableCollection WPF中删除项时,SelectedItem未更新

7cjasjjr  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(186)

ListView更新SelectedItem时遇到问题。ListView被绑定到一个ObservableCollection,并且有一个按钮将从该Observable集合中删除SelectedItem。

列表视图

<ListView x:Name="GroupList"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  HorizontalContentAlignment="Stretch"
                  SelectionMode="Single"
                  SelectedItem="{Binding SelectedReport, Mode=TwoWay}"
                  ItemsSource="{Binding Reports}"
                  SelectionChanged="GroupList_SelectionChanged">

按钮

<Button HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                Content="Remove"
                Command="{Binding RemoveSelectedCommand}"
                CommandParameter="{Binding ElementName=GroupList, Path=SelectedItem}"/>

在后面的代码中,我有一个函数来帮助调试ListView。它显示SelectedItem及其索引。

private void GroupList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
  Debug.WriteLine(((ListView)sender).SelectedItem);
  Debug.WriteLine(((ListView)sender).SelectedIndex);
}

ViewModel相对简单:

public class ViewModel : NotifyPropertyChangedBase
{
    private ObservableCollection<ReportData> reports;

    private ReportData selectedReport;

    public ViewModel()
    {
        this.RemoveSelectedCommand = new Command<ReportData>(this.RemoveSelectedFromGroup);
    }

    public ICommand RemoveSelectedCommand { get; private set; }

    public ObservableCollection<ReportData> Reports
    {
      get => this.reports;
    }

    public ReportData SelectedReport
    {
      get => this.selectedReport;
      set => SetProperty(ref this.selectedReport, value);
    }

    private void RemoveSelectedFromGroup(ReportData report)
    {
      if (report != null)
      {
        this.RemovedReports.Add(report);
        this.Reports.Remove(report);
      }
    }
}

INotifyPropertyChanged在NotifyPropertyChangedBase中实现,并且工作正常。
SelectedItem和SelectedIndex按预期更新,然后单击按钮删除项。但是,在我删除一个项目后,SelectedItem不会更新(保持为刚刚删除的项目),SelectedIndex始终等于-1。实际的ListView确实会在视觉上进行更新(移除的项消失/不再显示),但SelectedItem或SelectedIndex属性不会反映任何后续选定的项。
由于ObservableCollection显然是通过绑定来更新ListView的,我不明白为什么一旦删除了先前选择的项,SelectedItem也不能更新。
任何帮助将不胜感激。

ao218c7q

ao218c7q1#

我发现这种行为似乎是因为我在将报告从Reports集合中删除之前将其添加到另一个集合中。
当我将它从一个集合中删除,然后再将它添加到另一个集合中时,我再也看不到这种行为了。
我不知道为什么会这样-也许在SelectedItem属性中保留了一些引用。
我不再有这个问题,但我不完全理解为什么。

相关问题