Browse Source

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.
Steven Kirk 10 years ago
parent
commit
ad70cf874c

+ 3 - 6
samples/TestApplication/GalleryStyle.cs

@@ -107,13 +107,10 @@ namespace TestApplication
                     new Deck
                     {
                         Name = "deck",
-                        DataTemplates = new DataTemplates
-                        {
-                            new DataTemplate<TabItem>(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,
                     }
                 }

+ 31 - 0
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<IPageTransition> TransitionProperty =
             Deck.TransitionProperty.AddOwner<TabControl>();
 
+        private static readonly IMemberSelector s_contentSelector =
+            new FuncMemberSelector<object, object>(SelectContent);
+
         /// <summary>
         /// Initializes static members of the <see cref="TabControl"/> class.
         /// </summary>
@@ -34,6 +38,14 @@ namespace Perspex.Controls
             SelectedIndexProperty.Changed.AddClassHandler<TabControl>(x => x.SelectedIndexChanged);
         }
 
+        /// <summary>
+        /// Gets an <see cref="IMemberSelector"/> that selects the content of a <see cref="TabItem"/>.
+        /// </summary>
+        public IMemberSelector ContentSelector
+        {
+            get { return s_contentSelector; }
+        }
+
         /// <summary>
         /// Gets the <see cref="SelectingItemsControl.SelectedItem"/> as a <see cref="TabItem"/>.
         /// </summary>
@@ -65,6 +77,25 @@ namespace Perspex.Controls
             return control is DeckPresenter;
         }
 
+        /// <summary>
+        /// Selects the content of a tab item.
+        /// </summary>
+        /// <param name="o">The tab item.</param>
+        /// <returns>The content.</returns>
+        private static object SelectContent(object o)
+        {
+            var content = o as IContentControl;
+
+            if (content != null)
+            {
+                return content.Content;
+            }
+            else
+            {
+                return o;
+            }       
+        }
+
         /// <summary>
         /// Called when the <see cref="SelectingItemsControl.SelectedIndex"/> property changes.
         /// </summary>

+ 1 - 1
src/Perspex.Controls/Templates/FuncMemberSelector.cs

@@ -29,7 +29,7 @@ namespace Perspex.Controls.Templates
         /// <returns>The selected member.</returns>
         public object Select(object o)
         {
-            return (o is TObject) ? _selector((TObject)o) : o;
+            return (o is TObject) ? _selector((TObject)o) : default(TMember);
         }
     }
 }

+ 1 - 1
tests/Perspex.Controls.UnitTests/TabControlTests.cs

@@ -187,7 +187,7 @@ namespace Perspex.Controls.UnitTests
                     {
                         Name = "deck",
                         Template = new ControlTemplate<Deck>(CreateDeckTemplate),
-                        MemberSelector = new FuncMemberSelector<TabItem, object>(x => x.Content),
+                        MemberSelector = parent.ContentSelector,
                         [!ItemsControl.ItemsProperty] = parent[!ItemsControl.ItemsProperty],
                         [!SelectingItemsControl.SelectedItemProperty] = parent[!SelectingItemsControl.SelectedItemProperty],
                     }