Pārlūkot izejas kodu

avalonia: added dual function view models and tweaked datagrid

Kenric Nugteren 2 mēneši atpakaļ
vecāks
revīzija
84134a089a

+ 1 - 0
InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGrid.axaml

@@ -33,6 +33,7 @@
 				  AutoGenerateColumns="False"
 				  SelectionMode="{Binding $parent[components:AvaloniaDataGrid].SelectionMode}"
 				  Tapped="DataGrid_Tapped"
+				  SelectionChanged="DataGrid_SelectionChanged"
 				  RowHeight="{Binding $parent[components:AvaloniaDataGrid].RowHeight}"
 				  GridLinesVisibility="Vertical"
 				  FontSize="{StaticResource PrsFontSizeSmall}"

+ 15 - 2
InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGrid.axaml.cs

@@ -108,8 +108,11 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
     private static void ItemsSource_Changed(AvaloniaDataGrid grid, AvaloniaPropertyChangedEventArgs args)
     {
         grid.Grid.ItemsSource = grid.ItemsSource;
-        grid.Grid.CollectionView.CollectionChanged -= grid.CollectionView_CollectionChanged;
-        grid.Grid.CollectionView.CollectionChanged += grid.CollectionView_CollectionChanged;
+        if (grid.Grid.CollectionView is not null)
+        {
+            grid.Grid.CollectionView.CollectionChanged -= grid.CollectionView_CollectionChanged;
+            grid.Grid.CollectionView.CollectionChanged += grid.CollectionView_CollectionChanged;
+        }
         grid.UpdateSummaryRow();
     }
 
@@ -170,6 +173,7 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
     [RelayCommand]
     private void Search()
     {
+        if (Grid.CollectionView is null) return;
         Grid.CollectionView.Filter = DoSearch;
         Grid.CollectionView.Refresh();
         UpdateSummaryRow();
@@ -178,10 +182,19 @@ public partial class AvaloniaDataGrid : UserControl, INotifyPropertyChanged
     [RelayCommand]
     private void Refresh()
     {
+        if (Grid.CollectionView is null) return;
+
         RefreshRequested?.Invoke(this, new());
         Grid.CollectionView.Refresh();
     }
 
+    private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
+    {
+        if (SelectionMode != SelectionMode.Multiple) return;
+
+        SelectionChanged?.Invoke(this, new AvaloniaDataGridSelectionChangedEventArgs(SelectedItems.ToArray()));
+    }
+
     private void DataGrid_Tapped(object sender, TappedEventArgs e)
     {
         if (SelectionMode == SelectionMode.Multiple) return;

+ 19 - 2
InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGridColumns.cs

@@ -60,16 +60,33 @@ public class AvaloniaDataGridColumns : IList<IAvaloniaDataGridColumn>
         _changed = false;
     }
 
-    public void Add(IAvaloniaDataGridColumn item)
+    public AvaloniaDataGridColumns Add(IAvaloniaDataGridColumn item)
     {
         _columns.Add(item);
         DoChanged();
+        return this;
+    }
+    void ICollection<IAvaloniaDataGridColumn>.Add(IAvaloniaDataGridColumn item)
+    {
+        Add(item);
     }
 
-    public void Clear()
+    public AvaloniaDataGridColumns Clear()
     {
         _columns.Clear();
         DoChanged();
+        return this;
+    }
+    void ICollection<IAvaloniaDataGridColumn>.Clear()
+    {
+        Clear();
+    }
+
+    public AvaloniaDataGridColumns AddRange(IEnumerable<IAvaloniaDataGridColumn> items)
+    {
+        _columns.AddRange(items);
+        DoChanged();
+        return this;
     }
 
     public bool Contains(IAvaloniaDataGridColumn item) => _columns.Contains(item);

+ 9 - 1
InABox.Avalonia/Components/ButtonStrip/ButtonStrip.cs

@@ -65,7 +65,7 @@ public partial class ButtonStrip : TemplatedControl
         }
     }
 
-    public event EventHandler SelectionChanged;
+    public event EventHandler? SelectionChanged;
 
     static ButtonStrip()
     {
@@ -154,6 +154,14 @@ public partial class ButtonStrip : TemplatedControl
         var children = this.GetLogicalChildren().ToArray();
         SelectedItem = item;
     }
+
+    public void AddRange(IEnumerable<string> items)
+    {
+        foreach(var item in items)
+        {
+            Items.Add(new() { Text = item });
+        }
+    }
 }
 
 [PseudoClasses(":selected")]

+ 1 - 1
InABox.Avalonia/DataModels/ICoreRepository.cs

@@ -13,7 +13,7 @@ namespace InABox.Avalonia
     
     public delegate void CoreRepositoryChangedEvent(object sender, CoreRepositoryChangedEventArgs args);
     
-    public interface ICoreRepository :  INotifyPropertyChanged
+    public interface ICoreRepository :  INotifyPropertyChanged, IEnumerable
     {
         //IColumns GetColumns();
         

+ 16 - 0
InABox.Avalonia/Navigation/Navigation.cs

@@ -23,6 +23,14 @@ public interface IPopupViewModel
     bool IsClosed { get; }
 }
 
+/// <summary>
+/// Indicates that this view model can be a module or a popup.
+/// </summary>
+public interface IDualFunctionViewModel : IPopupViewModel, IViewModelBase
+{
+    bool IsPopup { get; set; }
+}
+
 public interface IPopupViewModel<TResult> : IPopupViewModel
 {
     TResult? GetResult();
@@ -59,6 +67,10 @@ public static class Navigation
     public static async Task<object?> Popup<T>(T viewModel, bool canTapAway = true)
         where T : IViewModelBase, IPopupViewModel
     {
+        if (viewModel is IDualFunctionViewModel dualFunction)
+        {
+            dualFunction.IsPopup = true;
+        }
         await viewModel.Activate();
         var _result = await DialogHostAvalonia.DialogHost.Show(viewModel, (object sender, DialogClosingEventArgs eventArgs) =>
         {
@@ -81,6 +93,10 @@ public static class Navigation
     public static async Task<TResult?> Popup<T, TResult>(T viewModel, bool canTapAway = true)
         where T : IViewModelBase, IPopupViewModel<TResult>
     {
+        if (viewModel is IDualFunctionViewModel dualFunction)
+        {
+            dualFunction.IsPopup = true;
+        }
         await viewModel.Activate();
         var _result = await DialogHostAvalonia.DialogHost.Show(viewModel, (object sender, DialogClosingEventArgs eventArgs) =>
         {

+ 4 - 0
InABox.Avalonia/Router/Router.cs

@@ -39,6 +39,10 @@ public class Router<TViewModelBase> where TViewModelBase:class
     public T InstantiateViewModel<T>(Action<T>? configure) where T : TViewModelBase
     {
         var result = (T)Convert.ChangeType(CreateViewModel(typeof(T)), typeof(T));
+        if (result is IDualFunctionViewModel dualFunction)
+        {
+            dualFunction.IsPopup = false;
+        }
         configure?.Invoke(result);
         return result;
     }