我有一个需要更新的列表视图(与使用静态列表的所有示例代码不同)。 xaml /代码片段如下所示:
<telerikDataControls:RadListView x:Name="processesListView" ItemsSource="{Binding Items, Mode=OneWay}"
SelectionMode="Single"
Grid.Row="2">
class ActionProcessItemViewModel : NotifyPropertyChangedBase {
// etc.
}
class ActionProcessesViewModel : NotifyPropertyChangedBase
{
ObservableCollection<ActionProcessItemViewModel> _items = new ObservableCollection<ActionProcessItemViewModel>();
internal ActionProcessesViewModel()
{
}
internal ObservableCollection<ActionProcessItemViewModel> Items => _items;
// this is an update not a replace: incoming list may be a partial snapshot
internal void UpdateItems(List<ActionProcessItemViewModel> updatedItems)
{
// remove any about-to-be-replaced items
foreach (ActionProcessItemViewModel it in updatedItems)
{
var itemsRows = _items.Where(row => row.ActionProcess.Id == it.ActionProcess.Id);
if (itemsRows.Count() == 1)
_items.Remove(itemsRows.First());
}
foreach (ActionProcessItemViewModel it in updatedItems)
_items.Add(it);
var sorted = Sort(_items.ToList());
_items.Clear(); // replace 'items' with the sorted list
foreach (ActionProcessItemViewModel ap in sorted)
_items.Add(ap);
OnPropertyChanged("Items");
}
private List<ActionProcessItemViewModel> Sort(List<ActionProcessItemViewModel> items)
{
return items
.OrderByDescending(o => o.CurrentState?.Time.Ticks).ToList()
.OrderByDescending(o => o.CurrentState?.Severity).ToList()
.OrderBy(o => o.CurrentState?.Type).ToList()
;
}
我知道更新_items会导致内存泄漏。我认为。垃圾收集,或没有垃圾收集,使得很难知道什么是泄漏,什么不是。我使用了Xamarin Profiler,它确认了很多Xamarin.Forms.BindableObject.BindablePropertyContext的分配。 正在查看Xamarin / Telerik / ObservableCollection文档和内容,但无法找到任何说我应该在这里做一些特别的事情。如何修复内存泄漏?
[我尝试过各种各样的事情来看待这种影响;喜欢跳过排序,这没什么用。我也尝试过根本不更新列表,这有很大的帮助(这不是唯一的内存泄漏,只是最糟糕的内存泄漏)。 ]