Skip to content

Commit

Permalink
Fix memory leak in ListView (#1243)
Browse files Browse the repository at this point in the history
  • Loading branch information
4nonym0us authored Feb 1, 2025
1 parent 817f3cd commit a7d345c
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions src/Wpf.Ui/Controls/ListView/ListView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ namespace Wpf.Ui.Controls;
/// </example>
public class ListView : System.Windows.Controls.ListView
{
private DependencyPropertyDescriptor? _descriptor;

/// <summary>Identifies the <see cref="ViewState"/> dependency property.</summary>
public static readonly DependencyProperty ViewStateProperty = DependencyProperty.Register(
nameof(ViewState),
Expand Down Expand Up @@ -62,21 +64,29 @@ protected virtual void OnViewStateChanged(DependencyPropertyChangedEventArgs e)
public ListView()
{
Loaded += OnLoaded;
Unloaded += OnUnloaded;
}

private void OnLoaded(object sender, RoutedEventArgs e)
{
Loaded -= OnLoaded; // prevent memory leaks

// Setup initial ViewState and hook into View property changes
var descriptor = DependencyPropertyDescriptor.FromProperty(
_descriptor = DependencyPropertyDescriptor.FromProperty(
System.Windows.Controls.ListView.ViewProperty,
typeof(System.Windows.Controls.ListView)
);
descriptor?.AddValueChanged(this, OnViewPropertyChanged);
_descriptor?.AddValueChanged(this, OnViewPropertyChanged);
UpdateViewState(); // set the initial state
}

private void OnUnloaded(object sender, RoutedEventArgs e)
{
Unloaded -= OnUnloaded;

_descriptor?.RemoveValueChanged(this, OnViewPropertyChanged);
}

private void OnViewPropertyChanged(object? sender, EventArgs e)
{
UpdateViewState();
Expand Down

0 comments on commit a7d345c

Please sign in to comment.