【发布时间】:2018-04-17 05:20:32
【问题描述】:
给定以下视图模型:
public class AttachmentsViewModel : ReactiveObject, ISupportsActivation
{
private ReactiveList<Attachment> _attachments;
public ReactiveList<Attachment> Attachments
{
get => _attachments;
set => this.RaiseAndSetIfChanged( ref _attachments, value );
}
private IReactiveDerivedList<AttachmentViewModel> _attachmentViewModels;
public IReactiveDerivedList<AttachmentViewModel> AttachmentViewModels
{
get => _attachmentViewModels;
set => this.RaiseAndSetIfChanged(ref _attachmentViewModels, value );
}
private AttachmentViewModel _selected;
public AttachmentViewModel Selected
{
get => _selected;
set => this.RaiseAndSetIfChanged( ref _selected, value );
}
}
Attachments 和 AttachmentViewModels 使用以下代码设置:
var items = DataManager.GetAttachmentsList();
Attachments = new ReactiveList<Attachment>( items ) { ChangeTrackingEnabled = true };
AttachmentViewModels = Attachments.CreateDerivedCollection( x => new AttachmentViewModel(x) );
AttachmentViewModels 绑定到ListView:
this.OneWayBind( ViewModel, vm => vm.AttachmentViewModels, v => v.List.ItemsSource );
this.Bind( ViewModel, vm => vm.Selected, v => v.List.SelectedItem );
但是,如果我通过 AttachmentViewModel 更新其中一个附件,那么因为 Attachments.ChangeTrackingEnabled 设置为 true,AttachmentViewModels.CollectionChanged 被触发。出于某种原因,这又将List.SelectedItem 设置为null。
有没有办法避免这种行为?另一个 SO post 暗示这可能是因为我没有在 AttachmentViewModel 中实现适当的相等运算符。我尝试遵循此建议,但似乎没有帮助。
另外,我必须将 ListView.IsSynchronizedWithCurrentItem 设置为 true - 否则 ListView 将不会保持原来的选择。但是,这并不能阻止SelectedItem 被设置为null,它只是意味着它被设置了两次。一次到null,然后又回到原来的选择。这没关系,只是它会在SelectedItem 更改时导致 UI 出现视觉故障。
【问题讨论】:
-
找到了一种可能的解决方法 - github.com/reactiveui/ReactiveUI/issues/1066。作者建议缓存视图模型并重新使用它们(当集合被重置时)
标签: xaml reactiveui