diff --git a/src/Perspex.Controls/Presenters/ContentPresenter.cs b/src/Perspex.Controls/Presenters/ContentPresenter.cs index f6a09f6cb1..0ea1eb4723 100644 --- a/src/Perspex.Controls/Presenters/ContentPresenter.cs +++ b/src/Perspex.Controls/Presenters/ContentPresenter.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Reactive.Linq; using Perspex.Controls.Primitives; using Perspex.Controls.Templates; using Perspex.Layout; @@ -83,6 +84,17 @@ namespace Perspex.Controls.Presenters TemplatedParentProperty.Changed.AddClassHandler(x => x.TemplatedParentChanged); } + /// + /// Initializes a new instance of the class. + /// + public ContentPresenter() + { + var dataContext = this.GetObservable(ContentProperty) + .Select(x => x is IControl ? PerspexProperty.UnsetValue : x); + + Bind(Control.DataContextProperty, dataContext); + } + /// /// Gets or sets a brush with which to paint the background. /// diff --git a/tests/Perspex.Controls.UnitTests/Presenters/ContentPresenterTests.cs b/tests/Perspex.Controls.UnitTests/Presenters/ContentPresenterTests.cs index b5c1b8f4eb..6ddb24afd1 100644 --- a/tests/Perspex.Controls.UnitTests/Presenters/ContentPresenterTests.cs +++ b/tests/Perspex.Controls.UnitTests/Presenters/ContentPresenterTests.cs @@ -130,6 +130,28 @@ namespace Perspex.Controls.UnitTests.Presenters Assert.IsType(target.Child); } + [Fact] + public void Assigning_Control_To_Content_Should_Not_Set_DataContext() + { + var target = new ContentPresenter + { + Content = new Border(), + }; + + Assert.False(target.IsSet(Control.DataContextProperty)); + } + + [Fact] + public void Assigning_NonControl_To_Content_Should_Set_DataContext() + { + var target = new ContentPresenter + { + Content = "foo", + }; + + Assert.Equal("foo", target.DataContext); + } + private class TestContentControl : TemplatedControl { public IControl Child { get; set; }