From 4e63eb8f07bc252b9875c7de2726d878ad27172a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 15 Apr 2016 00:19:07 +0200 Subject: [PATCH] Make ContentPresenter update its DataContext. Previous method introduced in 4241fd8331c6122950b444260dc3dd2aae1e0fd2 caused issue #503, because ContentPresenter should only use Content as its DataContext when it is not a control. Take the WPF approach and make ContentPresenter choose its own DataContext. Fixes #503. --- .../Presenters/ContentPresenter.cs | 12 ++++++++++ .../Presenters/ContentPresenterTests.cs | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+) 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; }