diff --git a/src/Perspex.Controls/Generators/IItemContainerGenerator.cs b/src/Perspex.Controls/Generators/IItemContainerGenerator.cs
index 6f3f71d6eb..7d098755c2 100644
--- a/src/Perspex.Controls/Generators/IItemContainerGenerator.cs
+++ b/src/Perspex.Controls/Generators/IItemContainerGenerator.cs
@@ -25,10 +25,12 @@ namespace Perspex.Controls.Generators
/// The index of the first item of the data in the containing collection.
///
/// The items.
+ /// An optional member selector.
/// The created controls.
IList CreateContainers(
int startingIndex,
- IEnumerable items);
+ IEnumerable items,
+ IMemberSelector selector);
///
/// Removes a set of created containers from the index and returns the removed controls.
diff --git a/src/Perspex.Controls/Generators/ItemContainerGenerator.cs b/src/Perspex.Controls/Generators/ItemContainerGenerator.cs
index 51f70fadb6..f2b2ff131f 100644
--- a/src/Perspex.Controls/Generators/ItemContainerGenerator.cs
+++ b/src/Perspex.Controls/Generators/ItemContainerGenerator.cs
@@ -45,10 +45,12 @@ namespace Perspex.Controls.Generators
/// The index of the first item of the data in the containing collection.
///
/// The items.
+ /// An optional member selector.
/// The created container controls.
public IList CreateContainers(
int startingIndex,
- IEnumerable items)
+ IEnumerable items,
+ IMemberSelector selector)
{
Contract.Requires(items != null);
@@ -57,7 +59,8 @@ namespace Perspex.Controls.Generators
foreach (var item in items)
{
- IControl container = CreateContainer(item);
+ var i = selector != null ? selector.Select(item) : item;
+ var container = CreateContainer(i);
result.Add(container);
}
diff --git a/src/Perspex.Controls/Generators/ItemContainerGenerator`1.cs b/src/Perspex.Controls/Generators/ItemContainerGenerator`1.cs
index 1f6cbeb6ac..561e3f61c5 100644
--- a/src/Perspex.Controls/Generators/ItemContainerGenerator`1.cs
+++ b/src/Perspex.Controls/Generators/ItemContainerGenerator`1.cs
@@ -37,7 +37,6 @@ namespace Perspex.Controls.Generators
{
var result = new T();
result.Content = Owner.MaterializeDataTemplate(item);
- result.DataContext = item;
return result;
}
}
diff --git a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
index c778f3750d..1a0fdb1a5f 100644
--- a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
+++ b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
@@ -46,8 +46,12 @@ namespace Perspex.Controls.Generators
/// The index of the first item of the data in the containing collection.
///
/// The items.
+ /// An optional member selector.
/// The created container controls.
- public IList CreateContainers(int startingIndex, IEnumerable items)
+ public IList CreateContainers(
+ int startingIndex,
+ IEnumerable items,
+ IMemberSelector selector)
{
Contract.Requires(items != null);
@@ -56,8 +60,9 @@ namespace Perspex.Controls.Generators
foreach (var item in items)
{
- var container = CreateContainer(item);
- _containers.Add(item, container);
+ var i = selector != null ? selector.Select(item) : item;
+ var container = CreateContainer(i);
+ _containers.Add(i, container);
result.Add(container);
}
diff --git a/src/Perspex.Controls/ItemsControl.cs b/src/Perspex.Controls/ItemsControl.cs
index 83f86eba78..2939347e67 100644
--- a/src/Perspex.Controls/ItemsControl.cs
+++ b/src/Perspex.Controls/ItemsControl.cs
@@ -33,13 +33,19 @@ namespace Perspex.Controls
/// Defines the property.
///
public static readonly PerspexProperty ItemsProperty =
- PerspexProperty.Register("Items");
+ PerspexProperty.Register(nameof(Items));
///
/// Defines the property.
///
public static readonly PerspexProperty> ItemsPanelProperty =
- PerspexProperty.Register>("ItemsPanel", defaultValue: DefaultPanel);
+ PerspexProperty.Register>(nameof(ItemsPanel), DefaultPanel);
+
+ ///
+ /// Defines the property.
+ ///
+ public static readonly PerspexProperty MemberSelectorProperty =
+ PerspexProperty.Register(nameof(MemberSelector));
private IItemContainerGenerator _itemContainerGenerator;
@@ -94,6 +100,15 @@ namespace Perspex.Controls
set { SetValue(ItemsPanelProperty, value); }
}
+ ///
+ /// Selects a member from to use as the list item.
+ ///
+ public IMemberSelector MemberSelector
+ {
+ get { return GetValue(MemberSelectorProperty); }
+ set { SetValue(MemberSelectorProperty, value); }
+ }
+
///
/// Gets the items presenter control.
///
diff --git a/src/Perspex.Controls/Perspex.Controls.csproj b/src/Perspex.Controls/Perspex.Controls.csproj
index 85972615f8..6bcd55b76c 100644
--- a/src/Perspex.Controls/Perspex.Controls.csproj
+++ b/src/Perspex.Controls/Perspex.Controls.csproj
@@ -71,6 +71,7 @@
+
@@ -122,6 +123,7 @@
+
diff --git a/src/Perspex.Controls/Presenters/DeckPresenter.cs b/src/Perspex.Controls/Presenters/DeckPresenter.cs
index 9b27aeee7b..526f37e7b9 100644
--- a/src/Perspex.Controls/Presenters/DeckPresenter.cs
+++ b/src/Perspex.Controls/Presenters/DeckPresenter.cs
@@ -30,6 +30,12 @@ namespace Perspex.Controls.Presenters
///
public static readonly PerspexProperty> ItemsPanelProperty =
ItemsControl.ItemsPanelProperty.AddOwner();
+
+ ///
+ /// Defines the property.
+ ///
+ public static readonly PerspexProperty MemberSelectorProperty =
+ ItemsControl.MemberSelectorProperty.AddOwner();
///
/// Defines the property.
@@ -101,6 +107,15 @@ namespace Perspex.Controls.Presenters
set { SetValue(ItemsPanelProperty, value); }
}
+ ///
+ /// Selects a member from to use as the list item.
+ ///
+ public IMemberSelector MemberSelector
+ {
+ get { return GetValue(MemberSelectorProperty); }
+ set { SetValue(MemberSelectorProperty, value); }
+ }
+
///
/// Gets or sets the index of the selected page.
///
@@ -181,7 +196,7 @@ namespace Perspex.Controls.Presenters
if (toIndex != -1)
{
var item = Items.Cast