Browse Source

Set item container properties with Style priority.

So that they can be overridden by styles.
pull/569/head
Steven Kirk 10 years ago
parent
commit
259144838c
  1. 14
      src/Avalonia.Controls/Generators/ItemContainerGenerator.cs
  2. 5
      src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs
  3. 2
      src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs
  4. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs
  5. 36
      tests/Avalonia.Controls.UnitTests/Generators/ItemContainerGeneratorTests.cs

14
src/Avalonia.Controls/Generators/ItemContainerGenerator.cs

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Avalonia.Controls.Presenters; using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Data;
namespace Avalonia.Controls.Generators namespace Avalonia.Controls.Generators
{ {
@ -187,11 +188,16 @@ namespace Avalonia.Controls.Generators
if (result == null) if (result == null)
{ {
result = new ContentPresenter result = new ContentPresenter();
result.SetValue(ContentPresenter.ContentProperty, item, BindingPriority.Style);
if (ItemTemplate != null)
{ {
ContentTemplate = ItemTemplate, result.SetValue(
Content = item, ContentPresenter.ContentTemplateProperty,
}; ItemTemplate,
BindingPriority.TemplatedParent);
}
} }
return result; return result;

5
src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs

@ -5,6 +5,7 @@ using System;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Data;
namespace Avalonia.Controls.Generators namespace Avalonia.Controls.Generators
{ {
@ -62,10 +63,10 @@ namespace Avalonia.Controls.Generators
if (ContentTemplateProperty != null) 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)) if (!(item is IControl))
{ {

2
src/Avalonia.Controls/Generators/TreeItemContainerGenerator.cs

@ -78,7 +78,7 @@ namespace Avalonia.Controls.Generators
var template = GetTreeDataTemplate(item, ItemTemplate); var template = GetTreeDataTemplate(item, ItemTemplate);
var result = new T(); var result = new T();
result.SetValue(ContentProperty, template.Build(item)); result.SetValue(ContentProperty, template.Build(item), BindingPriority.Style);
var itemsSelector = template.ItemsSelector(item); var itemsSelector = template.ItemsSelector(item);

2
src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs

@ -43,7 +43,7 @@ namespace Avalonia.Markup.Xaml.Templates
if (ItemsSource != null) if (ItemsSource != null)
{ {
var obs = new ExpressionObserver(item, ItemsSource.Path); var obs = new ExpressionObserver(item, ItemsSource.Path);
return new InstancedBinding(obs); return new InstancedBinding(obs, BindingPriority.Style);
} }
return null; return null;

36
tests/Avalonia.Controls.UnitTests/Generators/ItemContainerGeneratorTests.cs

@ -3,8 +3,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reactive.Linq;
using Avalonia.Controls.Generators; using Avalonia.Controls.Generators;
using Avalonia.Controls.Presenters; using Avalonia.Controls.Presenters;
using Avalonia.Data;
using Xunit; using Xunit;
namespace Avalonia.Controls.UnitTests.Generators 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)); 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<object>().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<ListBoxItem>(owner, ListBoxItem.ContentProperty, null);
var container = (ListBoxItem)target.Materialize(0, "foo", null).ContainerControl;
Assert.Equal("foo", container.Content);
container.Bind(
ContentPresenter.ContentProperty,
Observable.Never<object>().StartWith("bar"),
BindingPriority.Style);
Assert.Equal("bar", container.Content);
}
private IList<ItemContainerInfo> Materialize( private IList<ItemContainerInfo> Materialize(
IItemContainerGenerator generator, IItemContainerGenerator generator,
int index, int index,

Loading…
Cancel
Save