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也不能更新。
任何帮助将不胜感激。
1条答案
按热度按时间ao218c7q1#
我发现这种行为似乎是因为我在将报告从Reports集合中删除之前将其添加到另一个集合中。
当我将它从一个集合中删除,然后再将它添加到另一个集合中时,我再也看不到这种行为了。
我不知道为什么会这样-也许在SelectedItem属性中保留了一些引用。
我不再有这个问题,但我不完全理解为什么。