Browse Source

Fix ListBox item DataContexts.

pull/261/head
Steven Kirk 11 years ago
parent
commit
d1ae3ba50b
  1. 9
      src/Perspex.Controls/Generators/ItemContainerGenerator.cs
  2. 6
      src/Perspex.Controls/Generators/ItemContainerGenerator`1.cs
  3. 5
      src/Perspex.Controls/Presenters/ContentPresenter.cs
  4. 2
      src/Perspex.Controls/Templates/DataTemplateExtensions.cs
  5. 44
      tests/Perspex.Controls.UnitTests/ListBoxTests.cs

9
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
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
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)

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

Loading…
Cancel
Save