ソースを参照

DataGridTextColumn: Make FontFamily, FontSize, FontStyle, FontWeight and Foreground properties bindable

Maksym Katsydan 5 年 前
コミット
f33e12c229

+ 5 - 0
src/Avalonia.Controls.DataGrid/ApiCompatBaseline.txt

@@ -0,0 +1,5 @@
+Compat issues with assembly Avalonia.Controls.DataGrid:
+MembersMustExist : Member 'public Avalonia.StyledProperty<System.String> Avalonia.StyledProperty<System.String> Avalonia.Controls.DataGridTextColumn.FontFamilyProperty' does not exist in the implementation but it does exist in the contract.
+MembersMustExist : Member 'public System.String Avalonia.Controls.DataGridTextColumn.FontFamily.get()' does not exist in the implementation but it does exist in the contract.
+MembersMustExist : Member 'public void Avalonia.Controls.DataGridTextColumn.FontFamily.set(System.String)' does not exist in the implementation but it does exist in the contract.
+Total Issues: 3

+ 65 - 166
src/Avalonia.Controls.DataGrid/DataGridTextColumn.cs

@@ -20,11 +20,6 @@ namespace Avalonia.Controls
     {
         private const string DATAGRID_TextColumnCellTextBlockMarginKey = "DataGridTextColumnCellTextBlockMargin";
 
-        private double? _fontSize;
-        private FontStyle? _fontStyle;
-        private FontWeight? _fontWeight;
-        private IBrush _foreground;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="T:Avalonia.Controls.DataGridTextColumn" /> class.
         /// </summary>
@@ -36,18 +31,24 @@ namespace Avalonia.Controls
         /// <summary>
         /// Identifies the FontFamily dependency property.
         /// </summary>
-        public static readonly StyledProperty<string> FontFamilyProperty =
-            AvaloniaProperty.Register<DataGridTextColumn, string>(nameof(FontFamily));
+        public static readonly AttachedProperty<FontFamily> FontFamilyProperty =
+            TextBlock.FontFamilyProperty.AddOwner<DataGridTextColumn>();
 
         /// <summary>
         /// Gets or sets the font name.
         /// </summary>
-        public string FontFamily
+        public FontFamily FontFamily
         {
-            get { return GetValue(FontFamilyProperty); }
-            set { SetValue(FontFamilyProperty, value); }
+            get => GetValue(FontFamilyProperty);
+            set => SetValue(FontFamilyProperty, value);
         }
 
+        /// <summary>
+        /// Identifies the FontSize dependency property.
+        /// </summary>
+        public static readonly AttachedProperty<double> FontSizeProperty =
+            TextBlock.FontSizeProperty.AddOwner<DataGridTextColumn>();
+
         /// <summary>
         /// Gets or sets the font size.
         /// </summary>
@@ -55,74 +56,66 @@ namespace Avalonia.Controls
         [DefaultValue(double.NaN)]
         public double FontSize
         {
-            get
-            {
-                return _fontSize ?? Double.NaN;
-            }
-            set
-            {
-                if (_fontSize != value)
-                {
-                    _fontSize = value;
-                    NotifyPropertyChanged(nameof(FontSize));
-                }
-            }
+            get => GetValue(FontSizeProperty);
+            set => SetValue(FontSizeProperty, value);
         }
 
+        /// <summary>
+        /// Identifies the FontStyle dependency property.
+        /// </summary>
+        public static readonly AttachedProperty<FontStyle> FontStyleProperty =
+            TextBlock.FontStyleProperty.AddOwner<DataGridTextColumn>();
+
         /// <summary>
         /// Gets or sets the font style.
         /// </summary>
         public FontStyle FontStyle
         {
-            get
-            {
-                return _fontStyle ?? FontStyle.Normal;
-            }
-            set
-            {
-                if (_fontStyle != value)
-                {
-                    _fontStyle = value;
-                    NotifyPropertyChanged(nameof(FontStyle));
-                }
-            }
+            get => GetValue(FontStyleProperty);
+            set => SetValue(FontStyleProperty, value);
         }
 
+        /// <summary>
+        /// Identifies the FontWeight dependency property.
+        /// </summary>
+        public static readonly AttachedProperty<FontWeight> FontWeightProperty =
+            TextBlock.FontWeightProperty.AddOwner<DataGridTextColumn>();
+
         /// <summary>
         /// Gets or sets the font weight or thickness.
         /// </summary>
         public FontWeight FontWeight
         {
-            get
-            {
-                return _fontWeight ?? FontWeight.Normal;
-            }
-            set
-            {
-                if (_fontWeight != value)
-                {
-                    _fontWeight = value;
-                    NotifyPropertyChanged(nameof(FontWeight));
-                }
-            }
+            get => GetValue(FontWeightProperty);
+            set => SetValue(FontWeightProperty, value);
         }
 
+        /// <summary>
+        /// Identifies the Foreground dependency property.
+        /// </summary>
+        public static readonly AttachedProperty<IBrush> ForegroundProperty =
+            TextBlock.ForegroundProperty.AddOwner<DataGridTextColumn>();
+
         /// <summary>
         /// Gets or sets a brush that describes the foreground of the column cells.
         /// </summary>
         public IBrush Foreground
         {
-            get
-            {
-                return _foreground;
-            }
-            set
+            get => GetValue(ForegroundProperty);
+            set => SetValue(ForegroundProperty, value);
+        }
+
+        protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change)
+        {
+            base.OnPropertyChanged(change);
+
+            if (change.Property == FontFamilyProperty
+                || change.Property == FontSizeProperty
+                || change.Property == FontStyleProperty
+                || change.Property == FontWeightProperty
+                || change.Property == ForegroundProperty)
             {
-                if (_foreground != value)
-                {
-                    _foreground = value;
-                    NotifyPropertyChanged(nameof(Foreground));
-                }
+                NotifyPropertyChanged(change.Property.Name);
             }
         }
 
@@ -154,26 +147,7 @@ namespace Avalonia.Controls
                 Background = new SolidColorBrush(Colors.Transparent)
             };
 
-            if (IsSet(FontFamilyProperty))
-            {
-                textBox.FontFamily = FontFamily;
-            }
-            if (_fontSize.HasValue)
-            {
-                textBox.FontSize = _fontSize.Value;
-            }
-            if (_fontStyle.HasValue)
-            {
-                textBox.FontStyle = _fontStyle.Value;
-            }
-            if (_fontWeight.HasValue)
-            {
-                textBox.FontWeight = _fontWeight.Value;
-            }
-            if (_foreground != null)
-            {
-                textBox.Foreground = _foreground;
-            }
+            SyncProperties(textBox);
 
             return textBox;
         }
@@ -192,26 +166,8 @@ namespace Avalonia.Controls
                 VerticalAlignment = VerticalAlignment.Center
             };
 
-            if (IsSet(FontFamilyProperty))
-            {
-                textBlockElement.FontFamily = FontFamily;
-            }
-            if (_fontSize.HasValue)
-            {
-                textBlockElement.FontSize = _fontSize.Value;
-            }
-            if (_fontStyle.HasValue)
-            {
-                textBlockElement.FontStyle = _fontStyle.Value;
-            }
-            if (_fontWeight.HasValue)
-            {
-                textBlockElement.FontWeight = _fontWeight.Value;
-            }
-            if (_foreground != null)
-            {
-                textBlockElement.Foreground = _foreground;
-            }
+            SyncProperties(textBlockElement);
+
             if (Binding != null)
             {
                 textBlockElement.Bind(TextBlock.TextProperty, Binding);
@@ -261,99 +217,42 @@ namespace Avalonia.Controls
                 throw new ArgumentNullException("element");
             }
 
-            if(element is TextBox textBox)
+            if (element is AvaloniaObject content)
             {
                 if (propertyName == nameof(FontFamily))
                 {
-                    textBox.FontFamily = FontFamily;
+                    DataGridHelper.SyncColumnProperty(this, content, FontFamilyProperty);
                 }
                 else if (propertyName == nameof(FontSize))
                 {
-                    SetTextFontSize(textBox, TextBox.FontSizeProperty);
+                    DataGridHelper.SyncColumnProperty(this, content, FontSizeProperty);
                 }
                 else if (propertyName == nameof(FontStyle))
                 {
-                    textBox.FontStyle = FontStyle;
+                    DataGridHelper.SyncColumnProperty(this, content, FontStyleProperty);
                 }
                 else if (propertyName == nameof(FontWeight))
                 {
-                    textBox.FontWeight = FontWeight;
+                    DataGridHelper.SyncColumnProperty(this, content, FontWeightProperty);
                 }
                 else if (propertyName == nameof(Foreground))
                 {
-                    textBox.Foreground = Foreground;
-                }
-                else
-                {
-                    if (FontFamily != null)
-                    {
-                        textBox.FontFamily = FontFamily;
-                    }
-                    SetTextFontSize(textBox, TextBox.FontSizeProperty);
-                    textBox.FontStyle = FontStyle;
-                    textBox.FontWeight = FontWeight;
-                    if (Foreground != null)
-                    {
-                        textBox.Foreground = Foreground;
-                    }
-                }
-
-            }
-            else if (element is TextBlock textBlock)
-            {
-                if (propertyName == nameof(FontFamily))
-                {
-                    textBlock.FontFamily = FontFamily;
-                }
-                else if (propertyName == nameof(FontSize))
-                {
-                    SetTextFontSize(textBlock, TextBlock.FontSizeProperty);
-                }
-                else if (propertyName == nameof(FontStyle))
-                {
-                    textBlock.FontStyle = FontStyle;
-                }
-                else if (propertyName == nameof(FontWeight))
-                {
-                    textBlock.FontWeight = FontWeight;
-                }
-                else if (propertyName == nameof(Foreground))
-                {
-                    textBlock.Foreground = Foreground;
-                }
-                else
-                {
-                    if (FontFamily != null)
-                    {
-                        textBlock.FontFamily = FontFamily;
-                    }
-                    SetTextFontSize(textBlock, TextBlock.FontSizeProperty);
-                    textBlock.FontStyle = FontStyle;
-                    textBlock.FontWeight = FontWeight;
-                    if (Foreground != null)
-                    {
-                        textBlock.Foreground = Foreground;
-                    }
+                    DataGridHelper.SyncColumnProperty(this, content, ForegroundProperty);
                 }
             }
             else
             {
-                throw DataGridError.DataGrid.ValueIsNotAnInstanceOfEitherOr("element", typeof(TextBox), typeof(TextBlock));
+                throw DataGridError.DataGrid.ValueIsNotAnInstanceOf("element", typeof(AvaloniaObject));
             }
         }
 
-        private void SetTextFontSize(AvaloniaObject textElement, AvaloniaProperty fontSizeProperty)
+        private void SyncProperties(AvaloniaObject content)
         {
-            double newFontSize = FontSize;
-            if (double.IsNaN(newFontSize))
-            {
-                textElement.ClearValue(fontSizeProperty);
-            }
-            else
-            {
-                textElement.SetValue(fontSizeProperty, newFontSize);
-            }
+            DataGridHelper.SyncColumnProperty(this, content, FontFamilyProperty);
+            DataGridHelper.SyncColumnProperty(this, content, FontSizeProperty);
+            DataGridHelper.SyncColumnProperty(this, content, FontStyleProperty);
+            DataGridHelper.SyncColumnProperty(this, content, FontWeightProperty);
+            DataGridHelper.SyncColumnProperty(this, content, ForegroundProperty);
         }
-
     }
 }

+ 22 - 0
src/Avalonia.Controls.DataGrid/Utils/DataGridHelper.cs

@@ -0,0 +1,22 @@
+namespace Avalonia.Controls
+{
+    public static class DataGridHelper
+    {
+        internal static void SyncColumnProperty<T>(AvaloniaObject column, AvaloniaObject content, AvaloniaProperty<T> property)
+        {
+            SyncColumnProperty(column, content, property, property);
+        }
+
+        internal static void SyncColumnProperty<T>(AvaloniaObject column, AvaloniaObject content, AvaloniaProperty<T> contentProperty, AvaloniaProperty<T> columnProperty)
+        {
+            if (!column.IsSet(columnProperty))
+            {
+                content.ClearValue(contentProperty);
+            }
+            else
+            {
+                content.SetValue(contentProperty, column.GetValue(columnProperty));
+            }
+        }
+    }
+}