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 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;

5
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))
{

2
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);

2
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;

36
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<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(
IItemContainerGenerator generator,
int index,

Loading…
Cancel
Save