From ad70cf874c765fe4e3fe32a5c0d5b9290404bd4d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 26 Sep 2015 20:29:18 +0200 Subject: [PATCH] Make the TestApplication work again. Expose the tab item content selector from TabControl, and make FuncMemberSelector return default(T) if the parameter is of the wrong type. --- samples/TestApplication/GalleryStyle.cs | 9 ++---- src/Perspex.Controls/TabControl.cs | 31 +++++++++++++++++++ .../Templates/FuncMemberSelector.cs | 2 +- .../TabControlTests.cs | 2 +- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/samples/TestApplication/GalleryStyle.cs b/samples/TestApplication/GalleryStyle.cs index 15cbb5749b..1076e2cd0f 100644 --- a/samples/TestApplication/GalleryStyle.cs +++ b/samples/TestApplication/GalleryStyle.cs @@ -107,13 +107,10 @@ namespace TestApplication new Deck { Name = "deck", - DataTemplates = new DataTemplates - { - new DataTemplate(x => (Control)control.MaterializeDataTemplate(x.Content)), - }, + MemberSelector = control.ContentSelector, [~Deck.TransitionProperty] = control[~TabControl.TransitionProperty], - [!ItemsControl.ItemsProperty] = control[!ItemsControl.ItemsProperty], - [!SelectingItemsControl.SelectedItemProperty] = control[!SelectingItemsControl.SelectedItemProperty], + [!Deck.ItemsProperty] = control[!ItemsControl.ItemsProperty], + [!Deck.SelectedItemProperty] = control[!SelectingItemsControl.SelectedItemProperty], [Grid.ColumnProperty] = 1, } } diff --git a/src/Perspex.Controls/TabControl.cs b/src/Perspex.Controls/TabControl.cs index 14ed02a9b5..632137824d 100644 --- a/src/Perspex.Controls/TabControl.cs +++ b/src/Perspex.Controls/TabControl.cs @@ -4,6 +4,7 @@ using Perspex.Animation; using Perspex.Controls.Presenters; using Perspex.Controls.Primitives; +using Perspex.Controls.Templates; namespace Perspex.Controls { @@ -24,6 +25,9 @@ namespace Perspex.Controls public static readonly PerspexProperty TransitionProperty = Deck.TransitionProperty.AddOwner(); + private static readonly IMemberSelector s_contentSelector = + new FuncMemberSelector(SelectContent); + /// /// Initializes static members of the class. /// @@ -34,6 +38,14 @@ namespace Perspex.Controls SelectedIndexProperty.Changed.AddClassHandler(x => x.SelectedIndexChanged); } + /// + /// Gets an that selects the content of a . + /// + public IMemberSelector ContentSelector + { + get { return s_contentSelector; } + } + /// /// Gets the as a . /// @@ -65,6 +77,25 @@ namespace Perspex.Controls return control is DeckPresenter; } + /// + /// Selects the content of a tab item. + /// + /// The tab item. + /// The content. + private static object SelectContent(object o) + { + var content = o as IContentControl; + + if (content != null) + { + return content.Content; + } + else + { + return o; + } + } + /// /// Called when the property changes. /// diff --git a/src/Perspex.Controls/Templates/FuncMemberSelector.cs b/src/Perspex.Controls/Templates/FuncMemberSelector.cs index 0a0824eb1a..9ceab082b1 100644 --- a/src/Perspex.Controls/Templates/FuncMemberSelector.cs +++ b/src/Perspex.Controls/Templates/FuncMemberSelector.cs @@ -29,7 +29,7 @@ namespace Perspex.Controls.Templates /// The selected member. public object Select(object o) { - return (o is TObject) ? _selector((TObject)o) : o; + return (o is TObject) ? _selector((TObject)o) : default(TMember); } } } \ No newline at end of file diff --git a/tests/Perspex.Controls.UnitTests/TabControlTests.cs b/tests/Perspex.Controls.UnitTests/TabControlTests.cs index 0c1b80fa1a..57ef725e04 100644 --- a/tests/Perspex.Controls.UnitTests/TabControlTests.cs +++ b/tests/Perspex.Controls.UnitTests/TabControlTests.cs @@ -187,7 +187,7 @@ namespace Perspex.Controls.UnitTests { Name = "deck", Template = new ControlTemplate(CreateDeckTemplate), - MemberSelector = new FuncMemberSelector(x => x.Content), + MemberSelector = parent.ContentSelector, [!ItemsControl.ItemsProperty] = parent[!ItemsControl.ItemsProperty], [!SelectingItemsControl.SelectedItemProperty] = parent[!SelectingItemsControl.SelectedItemProperty], }