Я пытаюсь понять утечки памяти WPF, и после прочтения этой темы у меня есть некоторые неясные области.
Вопросы лучше всего получать из примера, поэтому давайте определим:
Модель:
public class Mom : INotifyPropertyChanged
{
public ObservableCollection<Kid> Kids { get; set; }
private string name;
public string Name
{
get => name;
set => Set(ref name, value);
}
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T field, T newValue = default(T), [CallerMemberName] string propertyName = null)
{
field = newValue;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
ViewModel (DataContext) может выглядеть так:
public class MomViewModel, INotifyPropertyChanged
{
private Mom selected;
public Mom Selected
{
get => selected;
set => Set(ref selected, value);
}
}
Теперь я хочу задать вопросы об этих 2 сценариях связывания в XAML:
Первая привязка:
<ListView ItemsSource="{Binding Selected.Kids}">
...
</ListView >
Вторая привязка:
<TextBlock Text="{Binding Selected.Kids.Count}" />
Теперь представьте, что внутри ViewModel у нас есть таймер, который назначает новую маму каждую секунду. Это Selected = new Mom { .. };
.
1:
Будет ли привязка 1 производить утечку памяти? Свойство имеет тип ObservableCollection, которое реализует INotifyPropertyChanged, но само свойство этого не делает (просто обычное get, set).
2:
Будет ли связывание 2 производить утечку памяти? Привязка напрямую относится к Count
из коллекции и не реализует INotifyPropertyChanged.
Обратите внимание, что само представление (XML) никогда не уничтожается - только свойство Selected изменяется каждую секунду. Мне (также) не ясно, когда WPF разрешает сборку мусора - только когда представление уничтожено или когда изменяется привязка. Мои тесты здесь неубедительны ...
Спасибо.