Преглед на файлове

Fix ListBox item DataContexts.

Steven Kirk преди 10 години
родител
ревизия
d1ae3ba50b

+ 8 - 1
src/Perspex.Controls/Generators/ItemContainerGenerator.cs

@@ -145,7 +145,14 @@ namespace Perspex.Controls.Generators
         /// <returns>The created container control.</returns>
         protected virtual IControl CreateContainer(object item)
         {
-            return Owner.MaterializeDataTemplate(item);
+            var result = Owner.MaterializeDataTemplate(item);
+
+            if (result != null && !(item is IControl))
+            {
+                result.DataContext = item;
+            }
+
+            return result;
         }
 
         /// <summary>

+ 6 - 0
src/Perspex.Controls/Generators/ItemContainerGenerator`1.cs

@@ -37,6 +37,12 @@ namespace Perspex.Controls.Generators
             {
                 var result = new T();
                 result.Content = Owner.MaterializeDataTemplate(item);
+
+                if (!(item is IControl))
+                {
+                    result.DataContext = item;
+                }
+
                 return result;
             }
         }

+ 5 - 0
src/Perspex.Controls/Presenters/ContentPresenter.cs

@@ -115,6 +115,11 @@ namespace Perspex.Controls.Presenters
 
             if (result != null)
             {
+                if (!(content is IControl))
+                {
+                    result.DataContext = content;
+                }
+
                 AddVisualChild(result);
 
                 if (result.Parent == null)

+ 0 - 2
src/Perspex.Controls/Templates/DataTemplateExtensions.cs

@@ -45,8 +45,6 @@ namespace Perspex.Controls.Templates
                         result = FuncDataTemplate.Default.Build(data);
                     }
 
-                    result.DataContext = data;
-
                     return result;
                 }
             }

+ 44 - 0
tests/Perspex.Controls.UnitTests/ListBoxTests.cs

@@ -50,6 +50,40 @@ namespace Perspex.Controls.UnitTests
             Assert.Equal(1, target.SelectedIndex);
         }
 
+        [Fact]
+        public void DataContexts_Should_Be_Correctly_Set()
+        {
+            var items = new object[]
+            {
+                "Foo",
+                new Item("Bar"),
+                new TextBlock { Text = "Baz" },
+                new ListBoxItem { Content = "Qux" },
+            };
+
+            var target = new ListBox
+            {
+                Template = new ControlTemplate(CreateListBoxTemplate),
+                DataContext = "Base",
+                DataTemplates = new DataTemplates
+                {
+                    new FuncDataTemplate<Item>(x => new Button { Content = x })
+                },
+                Items = items,
+            };
+
+            target.ApplyTemplate();
+
+            var dataContexts = target.Presenter.Panel.Children
+                .Cast<Control>()
+                .Select(x => x.DataContext)
+                .ToList();
+
+            Assert.Equal(
+                new object[] { items[0], items[1], "Base", "Base" },
+                dataContexts);
+        }
+
         private Control CreateListBoxTemplate(ITemplatedControl parent)
         {
             return new ScrollViewer
@@ -70,5 +104,15 @@ namespace Perspex.Controls.UnitTests
                 [~ContentPresenter.ContentProperty] = parent.GetObservable(ContentControl.ContentProperty),
             };
         }
+
+        private class Item
+        {
+            public Item(string value)
+            {
+                Value = value;
+            }
+
+            public string Value { get; }
+        }
     }
 }