예제 #1
0
        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);
        }