diff --git a/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs index 45f7dff49c..6bbf757106 100644 --- a/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs +++ b/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using Avalonia.Controls.Presenters; using Avalonia.Controls.Templates; +using Avalonia.Data; namespace Avalonia.Controls.Generators { @@ -187,11 +188,16 @@ namespace Avalonia.Controls.Generators if (result == null) { - result = new ContentPresenter + result = new ContentPresenter(); + result.SetValue(ContentPresenter.ContentProperty, item, BindingPriority.Style); + + if (ItemTemplate != null) { - ContentTemplate = ItemTemplate, - Content = item, - }; + result.SetValue( + ContentPresenter.ContentTemplateProperty, + ItemTemplate, + BindingPriority.TemplatedParent); + } } return result; diff --git a/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs b/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs index 35107a84fc..3aa2181cd4 100644 --- a/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs +++ b/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs @@ -5,6 +5,7 @@ using System; using System.Linq.Expressions; using System.Reflection; using Avalonia.Controls.Templates; +using Avalonia.Data; namespace Avalonia.Controls.Generators { @@ -62,10 +63,10 @@ namespace Avalonia.Controls.Generators if (ContentTemplateProperty != null) { - result.SetValue(ContentTemplateProperty, ItemTemplate); + result.SetValue(ContentTemplateProperty, ItemTemplate, BindingPriority.Style); } - result.SetValue(ContentProperty, item); + result.SetValue(ContentProperty, item, BindingPriority.Style); if (!(item is IControl)) { diff --git a/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs index e26a4fb0d6..8a70aa7307 100644 --- a/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs +++ b/src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs @@ -78,7 +78,7 @@ namespace Avalonia.Controls.Generators var template = GetTreeDataTemplate(item, ItemTemplate); var result = new T(); - result.SetValue(ContentProperty, template.Build(item)); + result.SetValue(ContentProperty, template.Build(item), BindingPriority.Style); var itemsSelector = template.ItemsSelector(item); diff --git a/src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs b/src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs index a640f00c65..32e0e4f4cb 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs @@ -43,7 +43,7 @@ namespace Avalonia.Markup.Xaml.Templates if (ItemsSource != null) { var obs = new ExpressionObserver(item, ItemsSource.Path); - return new InstancedBinding(obs); + return new InstancedBinding(obs, BindingPriority.Style); } return null; diff --git a/tests/Avalonia.Controls.UnitTests/Generators/ItemContainerGeneratorTests.cs b/tests/Avalonia.Controls.UnitTests/Generators/ItemContainerGeneratorTests.cs index 5d2269e73c..01b550fb3b 100644 --- a/tests/Avalonia.Controls.UnitTests/Generators/ItemContainerGeneratorTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Generators/ItemContainerGeneratorTests.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Linq; +using System.Reactive.Linq; using Avalonia.Controls.Generators; using Avalonia.Controls.Presenters; +using Avalonia.Data; using Xunit; namespace Avalonia.Controls.UnitTests.Generators @@ -111,6 +113,40 @@ namespace Avalonia.Controls.UnitTests.Generators Assert.Equal(new[] { 0, 1 }, target.Containers.Select(x => x.Index)); } + [Fact] + public void Style_Binding_Should_Be_Able_To_Override_Content() + { + var owner = new Decorator(); + var target = new ItemContainerGenerator(owner); + var container = (ContentPresenter)target.Materialize(0, "foo", null).ContainerControl; + + Assert.Equal("foo", container.Content); + + container.Bind( + ContentPresenter.ContentProperty, + Observable.Never().StartWith("bar"), + BindingPriority.Style); + + Assert.Equal("bar", container.Content); + } + + [Fact] + public void Style_Binding_Should_Be_Able_To_Override_Content_Typed() + { + var owner = new Decorator(); + var target = new ItemContainerGenerator(owner, ListBoxItem.ContentProperty, null); + var container = (ListBoxItem)target.Materialize(0, "foo", null).ContainerControl; + + Assert.Equal("foo", container.Content); + + container.Bind( + ContentPresenter.ContentProperty, + Observable.Never().StartWith("bar"), + BindingPriority.Style); + + Assert.Equal("bar", container.Content); + } + private IList Materialize( IItemContainerGenerator generator, int index,