diff --git a/Perspex.Controls/Control.cs b/Perspex.Controls/Control.cs index 7711c22467..a28f6c7bdf 100644 --- a/Perspex.Controls/Control.cs +++ b/Perspex.Controls/Control.cs @@ -20,6 +20,9 @@ namespace Perspex.Controls public class Control : InputElement, ILogical, IStyleable, IStyleHost { + public static readonly PerspexProperty DataContextProperty = + PerspexProperty.Register("DataContext", inherits: true); + public static readonly PerspexProperty ParentProperty = PerspexProperty.Register("Parent"); @@ -67,6 +70,12 @@ namespace Perspex.Controls } } + public object DataContext + { + get { return this.GetValue(DataContextProperty); } + set { this.SetValue(DataContextProperty, value); } + } + public DataTemplates DataTemplates { get diff --git a/Perspex.Controls/DataTemplateExtensions.cs b/Perspex.Controls/DataTemplateExtensions.cs index d4da5c4fb0..46de4be280 100644 --- a/Perspex.Controls/DataTemplateExtensions.cs +++ b/Perspex.Controls/DataTemplateExtensions.cs @@ -12,22 +12,27 @@ namespace Perspex.Controls public static class DataTemplateExtensions { - public static Control ApplyDataTemplate(this Control control, object data) + public static Control MaterializeDataTemplate(this Control control, object data) { - IDataTemplate result = control.FindDataTemplate(data); + IDataTemplate template = control.FindDataTemplate(data); + Control result; - if (result != null) + if (template != null) { - return result.Build(data); + result = template.Build(data); } else if (data is Control) { - return (Control)data; + result = (Control)data; } else { - return DataTemplate.Default.Build(data); + result = DataTemplate.Default.Build(data); } + + result.DataContext = data; + + return result; } public static IDataTemplate FindDataTemplate(this Control control, object data) diff --git a/Perspex.Controls/Generators/ItemContainerGenerator.cs b/Perspex.Controls/Generators/ItemContainerGenerator.cs index 45551874a2..4995facef1 100644 --- a/Perspex.Controls/Generators/ItemContainerGenerator.cs +++ b/Perspex.Controls/Generators/ItemContainerGenerator.cs @@ -116,7 +116,7 @@ namespace Perspex.Controls.Generators protected virtual Control CreateContainerOverride(object item) { - return this.Owner.ApplyDataTemplate(item); + return this.Owner.MaterializeDataTemplate(item); } protected void AddInternal(object item, Control container) diff --git a/Perspex.Controls/Generators/TypedItemContainerGenerator.cs b/Perspex.Controls/Generators/TypedItemContainerGenerator.cs index e486ccaf49..489e6457ef 100644 --- a/Perspex.Controls/Generators/TypedItemContainerGenerator.cs +++ b/Perspex.Controls/Generators/TypedItemContainerGenerator.cs @@ -20,7 +20,7 @@ namespace Perspex.Controls.Generators if (result == null) { result = new T(); - result.Content = this.Owner.ApplyDataTemplate(item); + result.Content = this.Owner.MaterializeDataTemplate(item); } return result; diff --git a/Perspex.Controls/Presenters/ContentPresenter.cs b/Perspex.Controls/Presenters/ContentPresenter.cs index 3c85e334f0..9522bfde0b 100644 --- a/Perspex.Controls/Presenters/ContentPresenter.cs +++ b/Perspex.Controls/Presenters/ContentPresenter.cs @@ -85,27 +85,7 @@ namespace Perspex.Controls.Presenters if (content != null) { - if (content is Control) - { - result = (Control)content; - } - else - { - IDataTemplate dataTemplate = this.FindDataTemplate(content); - - if (dataTemplate != null) - { - result = dataTemplate.Build(content); - } - else - { - result = new TextBlock - { - Text = content.ToString(), - }; - } - } - + result = this.MaterializeDataTemplate(content); var templatedParent = this.TemplatedParent as TemplatedControl; if (templatedParent != null)