diff --git a/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs b/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs
index ceabd09bb7..5de25e4c97 100644
--- a/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs
+++ b/src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs
@@ -36,12 +36,12 @@ namespace Perspex.Markup.Xaml.Templates
}
}
- public IEnumerable ItemsSelector(object item)
+ public InstancedBinding ItemsSelector(object item)
{
if (ItemsSource != null)
{
var obs = new ExpressionObserver(item, ItemsSource.Path);
- return obs.Take(1).Wait() as IEnumerable;
+ return new InstancedBinding(obs);
}
return null;
diff --git a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
index b6c1f48158..3dd3fa904b 100644
--- a/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
+++ b/src/Perspex.Controls/Generators/TreeItemContainerGenerator.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using Perspex.Controls.Templates;
+using Perspex.Data;
namespace Perspex.Controls.Generators
{
@@ -76,7 +77,7 @@ namespace Perspex.Controls.Generators
var result = new T();
result.SetValue(ContentProperty, template.Build(item));
- result.SetValue(ItemsProperty, template.ItemsSelector(item));
+ BindingOperations.Apply(result, ItemsProperty, template.ItemsSelector(item), null);
if (!(item is IControl))
{
diff --git a/src/Perspex.Controls/Templates/FuncTreeDataTemplate.cs b/src/Perspex.Controls/Templates/FuncTreeDataTemplate.cs
index 3d17cf5659..59b3115922 100644
--- a/src/Perspex.Controls/Templates/FuncTreeDataTemplate.cs
+++ b/src/Perspex.Controls/Templates/FuncTreeDataTemplate.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections;
using System.Reflection;
+using Perspex.Data;
namespace Perspex.Controls.Templates
{
@@ -59,9 +60,9 @@ namespace Perspex.Controls.Templates
///
/// The item.
/// The child items, or null if no child items.
- public IEnumerable ItemsSelector(object item)
+ public InstancedBinding ItemsSelector(object item)
{
- return this?._itemsSelector(item);
+ return new InstancedBinding(this?._itemsSelector(item));
}
///
diff --git a/src/Perspex.Controls/Templates/ITreeDataTemplate.cs b/src/Perspex.Controls/Templates/ITreeDataTemplate.cs
index 6415ed37b2..3b3f4159a0 100644
--- a/src/Perspex.Controls/Templates/ITreeDataTemplate.cs
+++ b/src/Perspex.Controls/Templates/ITreeDataTemplate.cs
@@ -1,7 +1,7 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
-using System.Collections;
+using Perspex.Data;
namespace Perspex.Controls.Templates
{
@@ -14,7 +14,10 @@ namespace Perspex.Controls.Templates
/// Selects the child items of an item.
///
/// The item.
- /// The child items, or null if no child items.
- IEnumerable ItemsSelector(object item);
+ ///
+ /// An holding the items, or an observable that tracks the
+ /// items. May return null if no child items.
+ ///
+ InstancedBinding ItemsSelector(object item);
}
}
\ No newline at end of file