public void When_ObservableVectorStringChanged() { var count = 0; var containerCount = 0; var panel = new StackPanel(); panel.ForceLoaded(); var source = new ObservableVector <string>() { "1", "2", "3" }; Style BuildContainerStyle() => new Style(typeof(Windows.UI.Xaml.Controls.ListViewItem)) { Setters = { new Setter <ContentControl>("Template", t => t.Template = Funcs.Create(() => { containerCount++; return(new Grid { Children = { new ContentPresenter() .Apply(p => { p.SetBinding(ContentPresenter.ContentTemplateProperty, new Binding() { Path = "ContentTemplate", RelativeSource = RelativeSource.TemplatedParent }); p.SetBinding(ContentPresenter.ContentProperty, new Binding() { Path = "Content", RelativeSource = RelativeSource.TemplatedParent }); }) } }); }) ) } }; var SUT = new ListView() { ItemsPanelRoot = panel, InternalItemsPanelRoot = panel, ItemContainerStyle = BuildContainerStyle(), ItemTemplate = new DataTemplate(() => { count++; return(new Border()); }) }; Assert.AreEqual(0, count); Assert.AreEqual(0, containerCount); Assert.AreEqual(0, containerCount); SUT.ItemsSource = source; Assert.AreEqual(3, count); Assert.AreEqual(3, containerCount); Assert.AreEqual(3, containerCount); source.Add("4"); Assert.AreEqual(4, count); Assert.AreEqual(4, containerCount); Assert.AreEqual(4, containerCount); source.Remove("1"); Assert.AreEqual(4, count); Assert.AreEqual(4, containerCount); Assert.AreEqual(4, containerCount); source[0] = "5"; // Data template is not recreated because of pooling Assert.AreEqual(4, count); // The item container style is reapplied (not cached) Assert.AreEqual(5, containerCount); }