Browse Source

Set DataContext when materializing data templates.

- Rename ApplyDataTemplate to MaterializeDataTemplate.
- Use MaterializeDataTemplate in ContentPresenter.
- Make DataContext property inherit.

Cherry-picked from GitHubClient branch.

Conflicts:
	Perspex.Controls/Control.cs
pull/39/head
Steven Kirk 11 years ago
parent
commit
188f4c6b78
  1. 9
      Perspex.Controls/Control.cs
  2. 17
      Perspex.Controls/DataTemplateExtensions.cs
  3. 2
      Perspex.Controls/Generators/ItemContainerGenerator.cs
  4. 2
      Perspex.Controls/Generators/TypedItemContainerGenerator.cs
  5. 22
      Perspex.Controls/Presenters/ContentPresenter.cs

9
Perspex.Controls/Control.cs

@ -20,6 +20,9 @@ namespace Perspex.Controls
public class Control : InputElement, ILogical, IStyleable, IStyleHost
{
public static readonly PerspexProperty<object> DataContextProperty =
PerspexProperty.Register<Control, object>("DataContext", inherits: true);
public static readonly PerspexProperty<Control> ParentProperty =
PerspexProperty.Register<Control, Control>("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

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

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

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

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

Loading…
Cancel
Save