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