|
|
|
@ -6,6 +6,7 @@ using System.Runtime.Remoting.Contexts; |
|
|
|
using Avalonia.Controls; |
|
|
|
using Avalonia.Controls.Shapes; |
|
|
|
using Avalonia.Controls.Templates; |
|
|
|
using Avalonia.Data; |
|
|
|
using Avalonia.Diagnostics; |
|
|
|
using Avalonia.Input; |
|
|
|
using Avalonia.Layout; |
|
|
|
@ -661,6 +662,70 @@ namespace Avalonia.LeakTests |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void ElementName_Binding_In_DataTemplate_Is_Freed() |
|
|
|
{ |
|
|
|
using (Start()) |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<int>(Enumerable.Range(0, 10)); |
|
|
|
NameScope ns; |
|
|
|
TextBox tb; |
|
|
|
ListBox lb; |
|
|
|
var window = new Window |
|
|
|
{ |
|
|
|
[NameScope.NameScopeProperty] = ns = new NameScope(), |
|
|
|
Width = 100, |
|
|
|
Height = 100, |
|
|
|
Content = new StackPanel |
|
|
|
{ |
|
|
|
Children = |
|
|
|
{ |
|
|
|
(tb = new TextBox |
|
|
|
{ |
|
|
|
Name = "tb", |
|
|
|
Text = "foo", |
|
|
|
}), |
|
|
|
(lb = new ListBox |
|
|
|
{ |
|
|
|
Items = items, |
|
|
|
ItemTemplate = new FuncDataTemplate<int>((_, _) => |
|
|
|
new Canvas |
|
|
|
{ |
|
|
|
Width = 10, |
|
|
|
Height = 10, |
|
|
|
[!Control.TagProperty] = new Binding |
|
|
|
{ |
|
|
|
ElementName = "tb", |
|
|
|
Path = "Text", |
|
|
|
NameScope = new WeakReference<INameScope>(ns), |
|
|
|
} |
|
|
|
}) |
|
|
|
}), |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
tb.RegisterInNameScope(ns); |
|
|
|
|
|
|
|
window.Show(); |
|
|
|
window.LayoutManager.ExecuteInitialLayoutPass(); |
|
|
|
|
|
|
|
Assert.Equal(10, lb.ItemContainerGenerator.Containers.Count()); |
|
|
|
|
|
|
|
var item0 = (ListBoxItem)lb.ItemContainerGenerator.Containers.First().ContainerControl; |
|
|
|
var canvas0 = (Canvas)item0.Presenter.Child; |
|
|
|
Assert.Equal("foo", canvas0.Tag); |
|
|
|
|
|
|
|
items.Clear(); |
|
|
|
window.LayoutManager.ExecuteLayoutPass(); |
|
|
|
|
|
|
|
Assert.Empty(lb.ItemContainerGenerator.Containers); |
|
|
|
|
|
|
|
dotMemory.Check(memory => |
|
|
|
Assert.Equal(0, memory.GetObjects(where => where.Type.Is<Canvas>()).ObjectsCount)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private IDisposable Start() |
|
|
|
{ |
|
|
|
return UnitTestApplication.Start(TestServices.StyledWindow.With( |
|
|
|
@ -669,6 +734,7 @@ namespace Avalonia.LeakTests |
|
|
|
inputManager: new InputManager())); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private class Node |
|
|
|
{ |
|
|
|
public string Name { get; set; } |
|
|
|
|