From f33e12c22996fbe3a23938462f5fe66de41df9fd Mon Sep 17 00:00:00 2001 From: Maksym Katsydan Date: Fri, 11 Sep 2020 04:05:05 -0400 Subject: [PATCH] DataGridTextColumn: Make FontFamily, FontSize, FontStyle, FontWeight and Foreground properties bindable --- .../ApiCompatBaseline.txt | 5 + .../DataGridTextColumn.cs | 231 +++++------------- .../Utils/DataGridHelper.cs | 22 ++ 3 files changed, 92 insertions(+), 166 deletions(-) create mode 100644 src/Avalonia.Controls.DataGrid/ApiCompatBaseline.txt create mode 100644 src/Avalonia.Controls.DataGrid/Utils/DataGridHelper.cs diff --git a/src/Avalonia.Controls.DataGrid/ApiCompatBaseline.txt b/src/Avalonia.Controls.DataGrid/ApiCompatBaseline.txt new file mode 100644 index 0000000000..82472c505a --- /dev/null +++ b/src/Avalonia.Controls.DataGrid/ApiCompatBaseline.txt @@ -0,0 +1,5 @@ +Compat issues with assembly Avalonia.Controls.DataGrid: +MembersMustExist : Member 'public Avalonia.StyledProperty Avalonia.StyledProperty 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 diff --git a/src/Avalonia.Controls.DataGrid/DataGridTextColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridTextColumn.cs index d31204b9e6..1cf6ab68ac 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridTextColumn.cs +++ b/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; - /// /// Initializes a new instance of the class. /// @@ -36,18 +31,24 @@ namespace Avalonia.Controls /// /// Identifies the FontFamily dependency property. /// - public static readonly StyledProperty FontFamilyProperty = - AvaloniaProperty.Register(nameof(FontFamily)); + public static readonly AttachedProperty FontFamilyProperty = + TextBlock.FontFamilyProperty.AddOwner(); /// /// Gets or sets the font name. /// - public string FontFamily + public FontFamily FontFamily { - get { return GetValue(FontFamilyProperty); } - set { SetValue(FontFamilyProperty, value); } + get => GetValue(FontFamilyProperty); + set => SetValue(FontFamilyProperty, value); } + /// + /// Identifies the FontSize dependency property. + /// + public static readonly AttachedProperty FontSizeProperty = + TextBlock.FontSizeProperty.AddOwner(); + /// /// Gets or sets the font size. /// @@ -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); } + /// + /// Identifies the FontStyle dependency property. + /// + public static readonly AttachedProperty FontStyleProperty = + TextBlock.FontStyleProperty.AddOwner(); + /// /// Gets or sets the font style. /// public FontStyle FontStyle { - get - { - return _fontStyle ?? FontStyle.Normal; - } - set - { - if (_fontStyle != value) - { - _fontStyle = value; - NotifyPropertyChanged(nameof(FontStyle)); - } - } + get => GetValue(FontStyleProperty); + set => SetValue(FontStyleProperty, value); } + /// + /// Identifies the FontWeight dependency property. + /// + public static readonly AttachedProperty FontWeightProperty = + TextBlock.FontWeightProperty.AddOwner(); + /// /// Gets or sets the font weight or thickness. /// public FontWeight FontWeight { - get - { - return _fontWeight ?? FontWeight.Normal; - } - set - { - if (_fontWeight != value) - { - _fontWeight = value; - NotifyPropertyChanged(nameof(FontWeight)); - } - } + get => GetValue(FontWeightProperty); + set => SetValue(FontWeightProperty, value); } + /// + /// Identifies the Foreground dependency property. + /// + public static readonly AttachedProperty ForegroundProperty = + TextBlock.ForegroundProperty.AddOwner(); + /// /// Gets or sets a brush that describes the foreground of the column cells. /// public IBrush Foreground { - get - { - return _foreground; - } - set + get => GetValue(ForegroundProperty); + set => SetValue(ForegroundProperty, value); + } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs 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); } - } } diff --git a/src/Avalonia.Controls.DataGrid/Utils/DataGridHelper.cs b/src/Avalonia.Controls.DataGrid/Utils/DataGridHelper.cs new file mode 100644 index 0000000000..d553a82fa0 --- /dev/null +++ b/src/Avalonia.Controls.DataGrid/Utils/DataGridHelper.cs @@ -0,0 +1,22 @@ +namespace Avalonia.Controls +{ + public static class DataGridHelper + { + internal static void SyncColumnProperty(AvaloniaObject column, AvaloniaObject content, AvaloniaProperty property) + { + SyncColumnProperty(column, content, property, property); + } + + internal static void SyncColumnProperty(AvaloniaObject column, AvaloniaObject content, AvaloniaProperty contentProperty, AvaloniaProperty columnProperty) + { + if (!column.IsSet(columnProperty)) + { + content.ClearValue(contentProperty); + } + else + { + content.SetValue(contentProperty, column.GetValue(columnProperty)); + } + } + } +}