Browse Source

Use ContentAttribute to identify content property.

Steven Kirk 10 years ago
parent
commit
1b17b037cf

+ 58 - 0
src/Markup/Perspex.Markup.Xaml/Context/PerspexContentPropertyProvider.cs

@@ -0,0 +1,58 @@
+// Copyright (c) The Perspex Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using Glass;
+using OmniXaml;
+using OmniXaml.Builder;
+using Perspex.Metadata;
+
+namespace Perspex.Markup.Xaml.Context
+{
+    public class PerspexContentPropertyProvider : IContentPropertyProvider
+    {
+        private Dictionary<Type, string> _values = new Dictionary<Type, string>();
+
+        public string GetContentPropertyName(Type type)
+        {
+            string result;
+
+            if (!_values.TryGetValue(type, out result))
+            {
+                result = LookupContentProperty(type);
+                _values[type] = result;
+            }
+
+            return result;
+        }
+
+        private string LookupContentProperty(Type type)
+        {
+            var result = (from member in type.GetRuntimeProperties()
+                          let att = member.GetCustomAttribute<ContentAttribute>()
+                          where att != null
+                          select member).FirstOrDefault();
+
+            return result?.Name;
+        }
+
+        void IAdd<ContentPropertyDefinition>.Add(ContentPropertyDefinition item)
+        {
+            throw new NotImplementedException();
+        }
+
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            throw new NotImplementedException();
+        }
+
+        IEnumerator<ContentPropertyDefinition> IEnumerable<ContentPropertyDefinition>.GetEnumerator()
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 2 - 21
src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs

@@ -110,28 +110,9 @@ namespace Perspex.Markup.Xaml.Context
             return typeConverterProvider;
         }
 
-        private static ContentPropertyProvider GetContentPropertyProvider()
+        private static IContentPropertyProvider GetContentPropertyProvider()
         {
-            var contentPropertyProvider = new ContentPropertyProvider();
-            var contentProperties = new Collection<ContentPropertyDefinition>
-            {
-                new ContentPropertyDefinition(typeof(ContentControl), "Content"),
-                new ContentPropertyDefinition(typeof(ControlTemplate), "Content"),
-                new ContentPropertyDefinition(typeof(DataTemplate), "Content"),
-                new ContentPropertyDefinition(typeof(Decorator), "Child"),
-                new ContentPropertyDefinition(typeof(ItemsControl), "Items"),
-                new ContentPropertyDefinition(typeof(GradientBrush), "GradientStops"),
-                new ContentPropertyDefinition(typeof(Panel), "Children"),
-                new ContentPropertyDefinition(typeof(Setter), "Value"),
-                new ContentPropertyDefinition(typeof(Style), "Setters"),
-                new ContentPropertyDefinition(typeof(TextBlock), "Text"),
-                new ContentPropertyDefinition(typeof(TextBox), "Text"),
-                new ContentPropertyDefinition(typeof(TreeDataTemplate), "Content"),
-            };
-
-            contentPropertyProvider.AddAll(contentProperties);
-
-            return contentPropertyProvider;
+            return new PerspexContentPropertyProvider();
         }
     }
 }

+ 1 - 0
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@@ -44,6 +44,7 @@
     <Compile Include="Binding\XamlBinding.cs" />
     <Compile Include="Binding\XamlBindingDefinition.cs" />
     <Compile Include="Context\PerspexAttachableXamlMember.cs" />
+    <Compile Include="Context\PerspexContentPropertyProvider.cs" />
     <Compile Include="Converters\ColorTypeConverter.cs" />
     <Compile Include="Converters\KeyGestureConverter.cs" />
     <Compile Include="Converters\RelativePointTypeConverter.cs" />

+ 3 - 0
src/Markup/Perspex.Markup.Xaml/Templates/ControlTemplate.cs

@@ -4,6 +4,7 @@
 using System;
 using Perspex.Controls;
 using Perspex.Controls.Templates;
+using Perspex.Metadata;
 using Perspex.Styling;
 
 namespace Perspex.Markup.Xaml.Templates
@@ -11,6 +12,8 @@ namespace Perspex.Markup.Xaml.Templates
     public class ControlTemplate : IControlTemplate
     {
         public Type TargetType { get; set; }
+
+        [Content]
         public TemplateContent Content { get; set; }
 
         public IControl Build(ITemplatedControl control)

+ 3 - 1
src/Markup/Perspex.Markup.Xaml/Templates/DataTemplate.cs

@@ -3,15 +3,17 @@
 
 using System;
 using System.Reflection;
-using OmniXaml.Attributes;
 using Perspex.Controls;
 using Perspex.Controls.Templates;
+using Perspex.Metadata;
 
 namespace Perspex.Markup.Xaml.Templates
 {
     public class DataTemplate : IDataTemplate
     {
         public Type DataType { get; set; }
+
+        [Content]
         public TemplateContent Content { get; set; }
 
         public bool Match(object data)

+ 4 - 0
src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs

@@ -8,13 +8,17 @@ using Perspex.Controls;
 using Perspex.Controls.Templates;
 using Perspex.Markup.Binding;
 using Perspex.Markup.Xaml.Binding;
+using Perspex.Metadata;
 
 namespace Perspex.Markup.Xaml.Templates
 {
     public class TreeDataTemplate : ITreeDataTemplate
     {
         public Type DataType { get; set; }
+
+        [Content]
         public TemplateContent Content { get; set; }
+
         public XamlBindingDefinition ItemsSource { get; set; }
 
         public bool Match(object data)

+ 15 - 0
src/Perspex.Base/Metadata/ContentAttribute.cs

@@ -0,0 +1,15 @@
+// Copyright (c) The Perspex Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using System;
+
+namespace Perspex.Metadata
+{
+    /// <summary>
+    /// Defines the property that contains the object's content in markup.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Property)]
+    public class ContentAttribute : Attribute
+    {
+    }
+}

+ 1 - 0
src/Perspex.Base/Perspex.Base.csproj

@@ -46,6 +46,7 @@
     <Compile Include="Diagnostics\PerspexObjectExtensions.cs" />
     <Compile Include="IObservablePropertyBag.cs" />
     <Compile Include="IPropertyBag.cs" />
+    <Compile Include="Metadata\ContentAttribute.cs" />
     <Compile Include="PerspexDisposable.cs" />
     <Compile Include="PerspexLocator.cs" />
     <Compile Include="Metadata\XmlnsDefinitionAttribute.cs" />

+ 2 - 0
src/Perspex.Controls/ContentControl.cs

@@ -7,6 +7,7 @@ using Perspex.Controls.Presenters;
 using Perspex.Controls.Primitives;
 using Perspex.Controls.Templates;
 using Perspex.Layout;
+using Perspex.Metadata;
 
 namespace Perspex.Controls
 {
@@ -43,6 +44,7 @@ namespace Perspex.Controls
         /// <summary>
         /// Gets or sets the content to display.
         /// </summary>
+        [Content]
         public object Content
         {
             get { return GetValue(ContentProperty); }

+ 2 - 0
src/Perspex.Controls/Decorator.cs

@@ -2,6 +2,7 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using Perspex.Collections;
+using Perspex.Metadata;
 
 namespace Perspex.Controls
 {
@@ -33,6 +34,7 @@ namespace Perspex.Controls
         /// <summary>
         /// Gets or sets the decorated control.
         /// </summary>
+        [Content]
         public Control Child
         {
             get { return GetValue(ChildProperty); }

+ 2 - 0
src/Perspex.Controls/ItemsControl.cs

@@ -13,6 +13,7 @@ using Perspex.Controls.Presenters;
 using Perspex.Controls.Primitives;
 using Perspex.Controls.Templates;
 using Perspex.Controls.Utils;
+using Perspex.Metadata;
 using Perspex.Styling;
 
 namespace Perspex.Controls
@@ -86,6 +87,7 @@ namespace Perspex.Controls
         /// <summary>
         /// Gets or sets the items to display.
         /// </summary>
+        [Content]
         public IEnumerable Items
         {
             get { return _items; }

+ 2 - 0
src/Perspex.Controls/Panel.cs

@@ -7,6 +7,7 @@ using System.Collections.Specialized;
 using System.Linq;
 using Perspex.Collections;
 using Perspex.Media;
+using Perspex.Metadata;
 
 namespace Perspex.Controls
 {
@@ -55,6 +56,7 @@ namespace Perspex.Controls
         /// it simply clears the existing collection and adds the contents of the assigned
         /// collection.
         /// </remarks>
+        [Content]
         public Controls Children
         {
             get

+ 2 - 0
src/Perspex.Controls/TextBlock.cs

@@ -5,6 +5,7 @@ using System;
 using System.Reactive;
 using System.Reactive.Linq;
 using Perspex.Media;
+using Perspex.Metadata;
 
 namespace Perspex.Controls
 {
@@ -125,6 +126,7 @@ namespace Perspex.Controls
         /// <summary>
         /// Gets or sets the text.
         /// </summary>
+        [Content]
         public string Text
         {
             get { return GetValue(TextProperty); }

+ 2 - 0
src/Perspex.Controls/TextBox.cs

@@ -13,6 +13,7 @@ using Perspex.Controls.Utils;
 using Perspex.Input;
 using Perspex.Interactivity;
 using Perspex.Media;
+using Perspex.Metadata;
 
 namespace Perspex.Controls
 {
@@ -101,6 +102,7 @@ namespace Perspex.Controls
             set { SetValue(SelectionEndProperty, value); }
         }
 
+        [Content]
         public string Text
         {
             get { return GetValue(TextProperty); }

+ 2 - 0
src/Perspex.SceneGraph/Media/GradientBrush.cs

@@ -2,6 +2,7 @@
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
 using System.Collections.Generic;
+using Perspex.Metadata;
 
 namespace Perspex.Media
 {
@@ -24,6 +25,7 @@ namespace Perspex.Media
             set { SetValue(SpreadMethodProperty, value); }
         }
 
+        [Content]
         public List<GradientStop> GradientStops
         {
             get { return GetValue(GradientStopsProperty); }

+ 2 - 0
src/Perspex.Styling/Styling/Setter.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 Perspex.Metadata;
 
 namespace Perspex.Styling
 {
@@ -44,6 +45,7 @@ namespace Perspex.Styling
         /// <summary>
         /// Gets or sets the property value.
         /// </summary>
+        [Content]
         public object Value
         {
             get;

+ 2 - 0
src/Perspex.Styling/Styling/Style.cs

@@ -4,6 +4,7 @@
 using System;
 using System.Collections.Generic;
 using System.Reactive.Linq;
+using Perspex.Metadata;
 
 namespace Perspex.Styling
 {
@@ -36,6 +37,7 @@ namespace Perspex.Styling
         /// <summary>
         /// Gets or sets style's setters.
         /// </summary>
+        [Content]
         public IEnumerable<ISetter> Setters { get; set; } = new List<ISetter>();
 
         /// <summary>