Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try generics #2

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 36 additions & 3 deletions TreeDataGridEx/TreeDataGridCheckBoxColumn.cs
Original file line number Diff line number Diff line change
@@ -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<TModel> : TreeDataGridColumnBase
where TModel : class
{
public static readonly DirectProperty<TreeDataGridCheckBoxColumn, IBinding?> BindingProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridCheckBoxColumn, IBinding?>(
public static readonly DirectProperty<TreeDataGridCheckBoxColumn<TModel>, IBinding?> BindingProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridCheckBoxColumn<TModel>, IBinding?>(
nameof(Binding),
o => o.Binding,
(o, v) => o.Binding = v);
Expand All @@ -22,4 +26,33 @@ public IBinding? Binding
get { return _binding; }
set { SetAndRaise(BindingProperty, ref _binding, value); }
}

public Expression<Func<TModel, bool>>? Getter { get; set; }

public Action<TModel, bool>? Setter { get; set; }

public override IColumn? Create()
{
var options = new CheckBoxColumnOptions<TModel>
{
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<TModel>(
Header,
Getter,
Setter,
Width,
options);

return column;
}
}
5 changes: 4 additions & 1 deletion TreeDataGridEx/TreeDataGridColumn.cs
Original file line number Diff line number Diff line change
@@ -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<TreeDataGridColumn, Type?> DataTypeProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridColumn, Type?>(
nameof(DataType),
Expand All @@ -22,4 +23,6 @@ public Type? DataType
get { return _dataType; }
set { SetAndRaise(DataTypeProperty, ref _dataType, value); }
}
*/
public abstract IColumn? Create();
}
2 changes: 1 addition & 1 deletion TreeDataGridEx/TreeDataGridEx.axaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TreeDataGridEx">
xmlns:local="clr-namespace:TreeDataGridEx">

<Design.PreviewWith>
<local:TreeDataGridEx />
Expand Down
9 changes: 5 additions & 4 deletions TreeDataGridEx/TreeDataGridEx.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ public IEnumerable ItemsSource

public TreeDataGrid? TreeDataGrid => _treeDataGrid;


public TreeDataGridEx()
{
SetCurrentValue(ColumnsProperty, new ObservableCollection<TreeDataGridColumn>());
Expand All @@ -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)
Expand All @@ -121,7 +122,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
Initialize();
}
}

/*
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ColumnList<>))]
private static ITreeDataGridSource? CreateSource(IEnumerable items, ObservableCollection<TreeDataGridColumn> columns)
{
Expand Down Expand Up @@ -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);
}
}*/
}
34 changes: 29 additions & 5 deletions TreeDataGridEx/TreeDataGridHierarchicalExpanderColumn.cs
Original file line number Diff line number Diff line change
@@ -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<TModel> : TreeDataGridColumn
where TModel : class
{
// TODO: HierarchicalExpanderColumn<>.hasChildrenSelector

// TODO: HierarchicalExpanderColumn<>.isExpandedSelector

public static readonly DirectProperty<TreeDataGridHierarchicalExpanderColumn, TreeDataGridColumn?> InnerProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridHierarchicalExpanderColumn, TreeDataGridColumn?>(
public static readonly DirectProperty<TreeDataGridHierarchicalExpanderColumn<TModel>, TreeDataGridColumn?> InnerProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridHierarchicalExpanderColumn<TModel>, TreeDataGridColumn?>(
nameof(Inner),
o => o.Inner,
(o, v) => o.Inner = v);

public static readonly DirectProperty<TreeDataGridHierarchicalExpanderColumn, string?> ChildrenNameProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridHierarchicalExpanderColumn, string?>(
public static readonly DirectProperty<TreeDataGridHierarchicalExpanderColumn<TModel>, string?> ChildrenNameProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridHierarchicalExpanderColumn<TModel>, string?>(
nameof(ChildrenName),
o => o.ChildrenName,
(o, v) => o.ChildrenName = v);
Expand All @@ -38,4 +43,23 @@ public string? ChildrenName
get => _childrenName;
set => SetAndRaise(ChildrenNameProperty, ref _childrenName, value);
}

public Func<TModel, IEnumerable<TModel>?>? ChildSelector { get; set; }

public Expression<Func<TModel, bool>>? HasChildrenSelector { get; set; }

public Expression<Func<TModel, bool>>? IsExpandedSelector { get; set; }

public override IColumn? Create()
{
var innerColumn = Inner?.Create() as IColumn<TModel>;

var column = new HierarchicalExpanderColumn<TModel>(
innerColumn,
ChildSelector,
HasChildrenSelector,
IsExpandedSelector);

return column;
}
}
38 changes: 33 additions & 5 deletions TreeDataGridEx/TreeDataGridTemplateColumn.cs
Original file line number Diff line number Diff line change
@@ -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<TModel> : TreeDataGridColumnBase
where TModel : class
{
// TODO: TemplateColumnOptions<>.IsTextSearchEnabled

// TODO: TemplateColumnOptions<>.TextSearchValueSelector

public static readonly DirectProperty<TreeDataGridTemplateColumn, IDataTemplate?> CellTemplateProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridTemplateColumn, IDataTemplate?>(
public static readonly DirectProperty<TreeDataGridTemplateColumn<TModel>, IDataTemplate?> CellTemplateProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridTemplateColumn<TModel>, IDataTemplate?>(
nameof(CellTemplate),
o => o.CellTemplate,
(o, v) => o.CellTemplate = v);

public static readonly DirectProperty<TreeDataGridTemplateColumn, IDataTemplate?> CellEditingTemplateProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridTemplateColumn, IDataTemplate?>(
public static readonly DirectProperty<TreeDataGridTemplateColumn<TModel>, IDataTemplate?> CellEditingTemplateProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridTemplateColumn<TModel>, IDataTemplate?>(
nameof(CellEditingTemplate),
o => o.CellEditingTemplate,
(o, v) => o.CellEditingTemplate = v);
Expand All @@ -39,4 +42,29 @@ public IDataTemplate? CellEditingTemplate
get => _cellEditingCellTemplate;
set => SetAndRaise(CellEditingTemplateProperty, ref _cellEditingCellTemplate, value);
}

public override IColumn? Create()
{
var options = new TemplateColumnOptions<TModel>()
{
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<TModel>(
Header,
CellTemplate,
CellEditingTemplate,
Width,
options);

return column;
}
}
45 changes: 39 additions & 6 deletions TreeDataGridEx/TreeDataGridTextColumn.cs
Original file line number Diff line number Diff line change
@@ -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<TModel, TValue> : TreeDataGridColumnBase
where TModel : class
{
public static readonly StyledProperty<bool> IsTextSearchEnabledProperty =
AvaloniaProperty.Register<TreeDataGridTextColumn, bool>(nameof(IsTextSearchEnabled));
AvaloniaProperty.Register<TreeDataGridTextColumn<TModel, TValue>, bool>(nameof(IsTextSearchEnabled));

public static readonly StyledProperty<TextTrimming> TextTrimmingProperty =
AvaloniaProperty.Register<TreeDataGridTextColumn, TextTrimming>(nameof(TextTrimming), TextTrimming.CharacterEllipsis);
AvaloniaProperty.Register<TreeDataGridTextColumn<TModel, TValue>, TextTrimming>(nameof(TextTrimming), TextTrimming.CharacterEllipsis);

public static readonly StyledProperty<TextWrapping> TextWrappingProperty =
AvaloniaProperty.Register<TreeDataGridTextColumn, TextWrapping>(nameof(TextWrapping), TextWrapping.NoWrap);
AvaloniaProperty.Register<TreeDataGridTextColumn<TModel, TValue>, TextWrapping>(nameof(TextWrapping), TextWrapping.NoWrap);

public static readonly DirectProperty<TreeDataGridTextColumn, IBinding?> BindingProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridTextColumn, IBinding?>(
public static readonly DirectProperty<TreeDataGridTextColumn<TModel, TValue>, IBinding?> BindingProperty =
AvaloniaProperty.RegisterDirect<TreeDataGridTextColumn<TModel, TValue>, IBinding?>(
nameof(Binding),
o => o.Binding,
(o, v) => o.Binding = v);
Expand Down Expand Up @@ -50,4 +54,33 @@ public IBinding? Binding
get { return _binding; }
set { SetAndRaise(BindingProperty, ref _binding, value); }
}

public Expression<Func<TModel, TValue?>> Getter { get; set; }

public Action<TModel, TValue?> Setter { get; set; }

public override IColumn? Create()
{
var options = new TextColumnOptions<TModel>
{
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<TModel, TValue>(
Header,
Getter,
Setter,
Width, null);

return column;
}
}
2 changes: 1 addition & 1 deletion TreeDataGridExDemo/App.axaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="TreeDataGridExDemo.App"
xmlns:local="using:TreeDataGridExDemo"
xmlns:local="clr-namespace:TreeDataGridExDemo"
RequestedThemeVariant="Default">

<Application.DataTemplates>
Expand Down
Loading