diff --git a/TreeDataGridEx/TreeDataGridCheckBoxColumn.cs b/TreeDataGridEx/TreeDataGridCheckBoxColumn.cs index 3517027..095b3b8 100644 --- a/TreeDataGridEx/TreeDataGridCheckBoxColumn.cs +++ b/TreeDataGridEx/TreeDataGridCheckBoxColumn.cs @@ -1,13 +1,17 @@ +using System; +using System.Linq.Expressions; using Avalonia; +using Avalonia.Controls.Models.TreeDataGrid; using Avalonia.Data; using Avalonia.Metadata; namespace TreeDataGridEx; -public class TreeDataGridCheckBoxColumn : TreeDataGridColumnBase +public class TreeDataGridCheckBoxColumn : TreeDataGridColumnBase + where TModel : class { - public static readonly DirectProperty BindingProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty, IBinding?> BindingProperty = + AvaloniaProperty.RegisterDirect, IBinding?>( nameof(Binding), o => o.Binding, (o, v) => o.Binding = v); @@ -22,4 +26,33 @@ public IBinding? Binding get { return _binding; } set { SetAndRaise(BindingProperty, ref _binding, value); } } + + public Expression>? Getter { get; set; } + + public Action? Setter { get; set; } + + public override IColumn? Create() + { + var options = new CheckBoxColumnOptions + { + CanUserResizeColumn = CanUserResizeColumn, + CanUserSortColumn = CanUserSortColumn, + MinWidth = MinWidth, + MaxWidth = MaxWidth, + // TODO: CompareAscending = CompareAscending, + // TODO: CompareDescending = CompareDescending, + BeginEditGestures = BeginEditGestures, + // TODO: IsTextSearchEnabled = IsTextSearchEnabled, + // TODO: TextSearchValueSelector = TextSearchValueSelector, + }; + + var column = new CheckBoxColumn( + Header, + Getter, + Setter, + Width, + options); + + return column; + } } diff --git a/TreeDataGridEx/TreeDataGridColumn.cs b/TreeDataGridEx/TreeDataGridColumn.cs index 0a411d5..b963936 100644 --- a/TreeDataGridEx/TreeDataGridColumn.cs +++ b/TreeDataGridEx/TreeDataGridColumn.cs @@ -1,12 +1,13 @@ using System; using System.Diagnostics.CodeAnalysis; using Avalonia; +using Avalonia.Controls.Models.TreeDataGrid; using Avalonia.Metadata; namespace TreeDataGridEx; public abstract class TreeDataGridColumn : AvaloniaObject -{ +{/* public static readonly DirectProperty DataTypeProperty = AvaloniaProperty.RegisterDirect( nameof(DataType), @@ -22,4 +23,6 @@ public Type? DataType get { return _dataType; } set { SetAndRaise(DataTypeProperty, ref _dataType, value); } } +*/ + public abstract IColumn? Create(); } diff --git a/TreeDataGridEx/TreeDataGridEx.axaml b/TreeDataGridEx/TreeDataGridEx.axaml index 69b241b..31f5c6f 100644 --- a/TreeDataGridEx/TreeDataGridEx.axaml +++ b/TreeDataGridEx/TreeDataGridEx.axaml @@ -1,6 +1,6 @@ + xmlns:local="clr-namespace:TreeDataGridEx"> diff --git a/TreeDataGridEx/TreeDataGridEx.axaml.cs b/TreeDataGridEx/TreeDataGridEx.axaml.cs index 9def477..66cfcd8 100644 --- a/TreeDataGridEx/TreeDataGridEx.axaml.cs +++ b/TreeDataGridEx/TreeDataGridEx.axaml.cs @@ -78,6 +78,7 @@ public IEnumerable ItemsSource public TreeDataGrid? TreeDataGrid => _treeDataGrid; + public TreeDataGridEx() { SetCurrentValue(ColumnsProperty, new ObservableCollection()); @@ -103,13 +104,13 @@ private void Initialize() { return; } - +/* var source = CreateSource(itemsSource, columns); if (source is not null) { _source = source; _treeDataGrid.Source = _source; - } + }*/ } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) @@ -121,7 +122,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang Initialize(); } } - +/* [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ColumnList<>))] private static ITreeDataGridSource? CreateSource(IEnumerable items, ObservableCollection columns) { @@ -450,5 +451,5 @@ private static LambdaExpression CreateChildSelectorLambdaExpression( var convertedPropertyAccess = Expression.Convert(propertyAccess, valueType); var lambdaType = typeof(Func<,>).MakeGenericType(modelType, valueType); return Expression.Lambda(lambdaType, convertedPropertyAccess, modelParameter); - } + }*/ } diff --git a/TreeDataGridEx/TreeDataGridHierarchicalExpanderColumn.cs b/TreeDataGridEx/TreeDataGridHierarchicalExpanderColumn.cs index f32f50e..02c7f65 100644 --- a/TreeDataGridEx/TreeDataGridHierarchicalExpanderColumn.cs +++ b/TreeDataGridEx/TreeDataGridHierarchicalExpanderColumn.cs @@ -1,22 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; using Avalonia; +using Avalonia.Controls.Models.TreeDataGrid; using Avalonia.Metadata; namespace TreeDataGridEx; -public class TreeDataGridHierarchicalExpanderColumn : TreeDataGridColumn +public class TreeDataGridHierarchicalExpanderColumn : TreeDataGridColumn + where TModel : class { // TODO: HierarchicalExpanderColumn<>.hasChildrenSelector // TODO: HierarchicalExpanderColumn<>.isExpandedSelector - public static readonly DirectProperty InnerProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty, TreeDataGridColumn?> InnerProperty = + AvaloniaProperty.RegisterDirect, TreeDataGridColumn?>( nameof(Inner), o => o.Inner, (o, v) => o.Inner = v); - public static readonly DirectProperty ChildrenNameProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty, string?> ChildrenNameProperty = + AvaloniaProperty.RegisterDirect, string?>( nameof(ChildrenName), o => o.ChildrenName, (o, v) => o.ChildrenName = v); @@ -38,4 +43,23 @@ public string? ChildrenName get => _childrenName; set => SetAndRaise(ChildrenNameProperty, ref _childrenName, value); } + + public Func?>? ChildSelector { get; set; } + + public Expression>? HasChildrenSelector { get; set; } + + public Expression>? IsExpandedSelector { get; set; } + + public override IColumn? Create() + { + var innerColumn = Inner?.Create() as IColumn; + + var column = new HierarchicalExpanderColumn( + innerColumn, + ChildSelector, + HasChildrenSelector, + IsExpandedSelector); + + return column; + } } diff --git a/TreeDataGridEx/TreeDataGridTemplateColumn.cs b/TreeDataGridEx/TreeDataGridTemplateColumn.cs index 689dc53..22d8c65 100644 --- a/TreeDataGridEx/TreeDataGridTemplateColumn.cs +++ b/TreeDataGridEx/TreeDataGridTemplateColumn.cs @@ -1,23 +1,26 @@ +using System; using Avalonia; +using Avalonia.Controls.Models.TreeDataGrid; using Avalonia.Controls.Templates; using Avalonia.Metadata; namespace TreeDataGridEx; -public class TreeDataGridTemplateColumn : TreeDataGridColumnBase +public class TreeDataGridTemplateColumn : TreeDataGridColumnBase + where TModel : class { // TODO: TemplateColumnOptions<>.IsTextSearchEnabled // TODO: TemplateColumnOptions<>.TextSearchValueSelector - public static readonly DirectProperty CellTemplateProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty, IDataTemplate?> CellTemplateProperty = + AvaloniaProperty.RegisterDirect, IDataTemplate?>( nameof(CellTemplate), o => o.CellTemplate, (o, v) => o.CellTemplate = v); - public static readonly DirectProperty CellEditingTemplateProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty, IDataTemplate?> CellEditingTemplateProperty = + AvaloniaProperty.RegisterDirect, IDataTemplate?>( nameof(CellEditingTemplate), o => o.CellEditingTemplate, (o, v) => o.CellEditingTemplate = v); @@ -39,4 +42,29 @@ public IDataTemplate? CellEditingTemplate get => _cellEditingCellTemplate; set => SetAndRaise(CellEditingTemplateProperty, ref _cellEditingCellTemplate, value); } + + public override IColumn? Create() + { + var options = new TemplateColumnOptions() + { + CanUserResizeColumn = CanUserResizeColumn, + CanUserSortColumn = CanUserSortColumn, + MinWidth = MinWidth, + MaxWidth = MaxWidth, + // TODO: CompareAscending = CompareAscending, + // TODO: CompareDescending = CompareDescending, + BeginEditGestures = BeginEditGestures, + // TODO: IsTextSearchEnabled = IsTextSearchEnabled, + // TODO: TextSearchValueSelector = TextSearchValueSelector, + }; + + var column = new TemplateColumn( + Header, + CellTemplate, + CellEditingTemplate, + Width, + options); + + return column; + } } diff --git a/TreeDataGridEx/TreeDataGridTextColumn.cs b/TreeDataGridEx/TreeDataGridTextColumn.cs index ec9cb15..4483895 100644 --- a/TreeDataGridEx/TreeDataGridTextColumn.cs +++ b/TreeDataGridEx/TreeDataGridTextColumn.cs @@ -1,23 +1,27 @@ +using System; +using System.Linq.Expressions; using Avalonia; +using Avalonia.Controls.Models.TreeDataGrid; using Avalonia.Data; using Avalonia.Media; using Avalonia.Metadata; namespace TreeDataGridEx; -public class TreeDataGridTextColumn : TreeDataGridColumnBase +public class TreeDataGridTextColumn : TreeDataGridColumnBase + where TModel : class { public static readonly StyledProperty IsTextSearchEnabledProperty = - AvaloniaProperty.Register(nameof(IsTextSearchEnabled)); + AvaloniaProperty.Register, bool>(nameof(IsTextSearchEnabled)); public static readonly StyledProperty TextTrimmingProperty = - AvaloniaProperty.Register(nameof(TextTrimming), TextTrimming.CharacterEllipsis); + AvaloniaProperty.Register, TextTrimming>(nameof(TextTrimming), TextTrimming.CharacterEllipsis); public static readonly StyledProperty TextWrappingProperty = - AvaloniaProperty.Register(nameof(TextWrapping), TextWrapping.NoWrap); + AvaloniaProperty.Register, TextWrapping>(nameof(TextWrapping), TextWrapping.NoWrap); - public static readonly DirectProperty BindingProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty, IBinding?> BindingProperty = + AvaloniaProperty.RegisterDirect, IBinding?>( nameof(Binding), o => o.Binding, (o, v) => o.Binding = v); @@ -50,4 +54,33 @@ public IBinding? Binding get { return _binding; } set { SetAndRaise(BindingProperty, ref _binding, value); } } + + public Expression> Getter { get; set; } + + public Action Setter { get; set; } + + public override IColumn? Create() + { + var options = new TextColumnOptions + { + CanUserResizeColumn = CanUserResizeColumn, + CanUserSortColumn = CanUserSortColumn, + MinWidth = MinWidth, + MaxWidth = MaxWidth, + // TODO: CompareAscending = CompareAscending, + // TODO: CompareDescending = CompareDescending, + BeginEditGestures = BeginEditGestures, + IsTextSearchEnabled = IsTextSearchEnabled, + TextTrimming = TextTrimming, + TextWrapping = TextWrapping, + }; + + var column = new TextColumn( + Header, + Getter, + Setter, + Width, null); + + return column; + } } diff --git a/TreeDataGridExDemo/App.axaml b/TreeDataGridExDemo/App.axaml index bf1fbd1..224f624 100644 --- a/TreeDataGridExDemo/App.axaml +++ b/TreeDataGridExDemo/App.axaml @@ -1,7 +1,7 @@ diff --git a/TreeDataGridExDemo/Views/MainWindow.axaml b/TreeDataGridExDemo/Views/MainWindow.axaml index e08f531..8e27a42 100644 --- a/TreeDataGridExDemo/Views/MainWindow.axaml +++ b/TreeDataGridExDemo/Views/MainWindow.axaml @@ -1,10 +1,12 @@ - - - - + + + + - - + + - + - - - + + + @@ -58,12 +60,12 @@ - - - - - - + + + + + + @@ -80,11 +82,11 @@ - - + + - - + + @@ -95,11 +97,11 @@ - - - - - + + + + +