Xaml 当设置ChangeTrackEnabled时,防止ListView.SelectedItem设置为null

Xaml 当设置ChangeTrackEnabled时,防止ListView.SelectedItem设置为null,xaml,reactiveui,Xaml,Reactiveui,给定以下视图模型: public类附件viewmodel:ReactiveObject,ISupportsActivation { private ReactiveList暗示这可能是因为我没有在AttachmentViewModel中实现适当的相等运算符。我尝试遵循此建议,但似乎没有帮助 此外,我还必须将ListView.IsSynchronizedWithCurrentItem设置为true-否则ListView将不会保持原始选择。但是,这并不阻止SelectedItem设置为null,这只

给定以下视图模型:

public类附件viewmodel:ReactiveObject,ISupportsActivation
{
private ReactiveList暗示这可能是因为我没有在
AttachmentViewModel
中实现适当的相等运算符。我尝试遵循此建议,但似乎没有帮助


此外,我还必须将
ListView.IsSynchronizedWithCurrentItem
设置为true-否则
ListView
将不会保持原始选择。但是,这并不阻止
SelectedItem
设置为
null
,这只是意味着它被设置了两次。一次设置为
null
,然后另一次返回到o原始选择。如果
SelectedItem
更改时,这会导致UI中出现视觉故障。

反应列表中的项的属性更改且
ChangeTrackingEnabled
true
时,将触发
CollectionChanged
事件。对于关联的
IReactiveveDerivedList
,这意味着重新创建整个集合。由于生成了新的
AttachmentViewModel
(对于相同的
附件
),因此
SelectedItem
不再指向列表中的项目。它的默认行为是变为
null

通过实现缓存,可以重新恢复相同的
AttachmentViewModel
——尽管发生了集合更改事件

基于此,我实现了以下内容:

public类附件viewmodel:ReactiveObject
{
专用只读词典_cache=new Dictionary();
私有反应列表附件;
公共反应列表附件
{
获取=>\u附件;
set=>this.RaiseAndSetIfChanged(参考附件,值);
}
私有IReactiveDerivedList_attachmentViewModels;
公共IReactiveDerivedList附件视图模型
{
get=>\u attachmentViewModels;
set=>this.RaiseAndSetIfChanged(参考附件视图模型,值);
}
已选择private AttachmentViewModel;
已选择公共附件视图模型
{
get=>\u选中;
set=>this.RaiseAndSetIfChanged(ref\u selected,value);
}
公共void LoadAttachments()
{
_cache.Clear();
var items=DataManager.GetAttachmentsList();
附件=新的反应列表(项){ChangeTrackingEnabled=true};
AttachmentViewModels=Attachments.CreateDerivedCollection(x=>{
附件视图模型视图模型;
if(_cache.ContainsKey(x)){
viewModel=_缓存[x];
}否则{
viewModel=新附件viewModel(x);
_cache.Add(x,viewModel);
}
返回视图模型;
});
}
}

请注意,
Attachment
对象有自己的相等运算符(基于
ID
属性)。用户可以还原其更改,因此我必须添加
\u cache.Clear()
以进行补偿。

找到了一个可能的解决方法-。作者建议缓存视图模型并重新使用它们(当集合重置时)这让我想知道,这是否可以通过在
AttachmentViewModel
中实现适当的相等运算符来解决?然后
SelectedItem
将指向列表中的一个项目。如果相等是基于基础
Attachment.ID
,那么可能不需要缓存?