我正在尝试使用列表框显示上传文件的文件名列表。我在列表框中有上传、打开和删除文件的按钮。我正在使用 mvvm 模式并将 itemsource 绑定到可观察的集合。当我修改集合(即:上传或删除)时,列表框不会刷新以反映集合更改时的更改。我确信我实现这一点的方式很糟糕。在这一点上,我对可观察集合如何通知更改感到完全困惑。下面是我的代码:
<ListBox x:Name="Listbox1"
SelectedItem="{Binding SelectedFile}"
SelectedIndex="{Binding SelectedIndexNum}"
ItemsSource="{Binding Path=FileNames, UpdateSourceTrigger=PropertyChanged}">
</ListBox>
<Button Content="UploadFile"
Command="{Binding Path=UploadFileCommand}"
</Button>
<Button Content="Delete File"
Command="{Binding Path=DeleteFileCommand}"
</Button>
视图模型属性:
public ObservableCollection<string> FileNames
{
get
{
if (this.SomeDataStruc.UploadedFileDataCollection == null || this.SomeDataStruc.UploadedFileDataCollection .Count() <= 0)
{
return new ObservableCollection<string>();
}
else
{
var uploadedFileList = this.SomeDataStruc.UploadedFileDataCollection .Where(r => r.Id == this.SomeDataStruc.Id);
var filenames = new ObservableCollection<string>(uploadedFileList.Select(c => c.FileName));//.ToList();
return filenames;
}
}
}
请注意 SomeDataStruc 有一个可观察的集合。这个 UploadedFileData 有很多字段,我只在列表框中显示文件名。
private void DeleteReport(object parameter)
{
this.UploadedFileDataCollection[_selectedIndex].Status = DataStatusEnum.Deleted;
this.SomeDataStruc.UploadedFileDataCollection.RemoveAt(_selectedIndex);
this.OnPropertyChanged("FileNames"); // i need to do this...Listbox doesnt update without this.
}
我究竟做错了什么。我应该处理 collectionchanged 事件吗?如果是,为什么?这不是可观察收集的重点......它自己通知吗?
我检查了许多类似的主题。但这似乎并没有消除我的困惑。请帮帮我。