ソースを参照

Fixed MobileToolGrid layout support for invisible items
Added check to ensure CoreRepository Cache folder exists

Frank van den Bos 1 年間 前
コミット
6673a61a41

+ 1 - 5
InABox.Mobile/InABox.Mobile.Shared/Components/MobileToolGrid/MobileToolGrid.xaml

@@ -8,10 +8,6 @@
     <ContentView.Resources>
         <local:BooleanToColorConverter x:Key="BooleanToColorConverter" TrueColor="LightSalmon" FalseColor="LightGoldenrodYellow"/>
     </ContentView.Resources>
-
-    <ContentView.BindingContext>
-        <local:ToolGridViewModel x:Name="_viewModel" LayoutChanged="_viewModel_OnLayoutChanged"/>
-    </ContentView.BindingContext>
     
     <ContentView.Content>
         
@@ -19,7 +15,7 @@
             
             <Grid RowSpacing="5" ColumnSpacing="5"
                 x:Name="_flexgrid"
-                BindableLayout.ItemsSource = "{Binding Items}"
+                BindableLayout.ItemsSource = "{Binding VisibleItems}"
                 HorizontalOptions="Fill"
                 VerticalOptions="StartAndExpand"
                >

+ 54 - 13
InABox.Mobile/InABox.Mobile.Shared/Components/MobileToolGrid/MobileToolGrid.xaml.cs

@@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
 using System.Globalization;
 using System.Linq;
 using System.Threading.Tasks;
+using Syncfusion.Data.Extensions;
 using Xamarin.Essentials;
 using Xamarin.Forms;
 using Xamarin.Forms.Xaml;
@@ -26,39 +27,63 @@ namespace InABox.Mobile
     
     public class ToolGridViewModel : BindableObject
     {
-        public IList<IMobileToolItem> Items { get; private set; }
+        public CoreObservableCollection<IMobileToolItem> Items { get; private set; }
 
-        public IList<IMobileToolItem> VisibleItems { get; private set; }
+        public CoreObservableCollection<IMobileToolItem> VisibleItems { get; private set; }
         
         public int Columns { get; set; }
+
+        private bool _disableUpdate = false;
         
+        public void BeginUpdate() 
+            => _disableUpdate = true;
+
+        public void EndUpdate()
+        {
+            _disableUpdate = false;
+            Refresh();
+        }
         public ToolGridViewModel()
         {
             Columns = Device.Idiom == TargetIdiom.Tablet ? 6 : 4;
-            Items = new ObservableCollection<IMobileToolItem>();
+            VisibleItems = new CoreObservableCollection<IMobileToolItem>();
 
-            VisibleItems = new ObservableCollection<IMobileToolItem>();
-            ((ObservableCollection<IMobileToolItem>)Items).CollectionChanged += (sender, args) =>
+            Items = new CoreObservableCollection<IMobileToolItem>();
+            Items.CollectionChanged += (sender, args) =>
             {
+
+                if (args.OldItems != null)
+                {
+                    foreach (var item in args.OldItems?.OfType<MobileToolItem>())
+                        item.Changed -= ItemChanged;
+                }
+
+                if (args.NewItems != null)
+                {
+                    foreach (var item in args.NewItems.OfType<MobileToolItem>())
+                        item.Changed += ItemChanged;
+                }
+
                 Refresh();
             };
         }
 
+        private void ItemChanged(object sender, EventArgs e) 
+            => Refresh();
+
         public void Refresh()
         {
+            if (_disableUpdate)
+                return;
+            
             VisibleItems.Clear();
-            DoLayout();
-        }
-
-        private void DoLayout()
-        {
+            VisibleItems.AddRange(Items.Where(x => x.IsVisible).ToArray());
             int iRow = 0;
             int iCol = 0;
-            foreach (var item in Items.Where(x => x.IsVisible))
+            foreach (var item in VisibleItems)
             {
                 item.Row = iRow;
                 item.Column = iCol;
-                VisibleItems.Add(item);
                 iCol++;
                 if (iCol == Columns)
                 {
@@ -83,11 +108,25 @@ namespace InABox.Mobile
         
         public event EventHandler BeforeTap;
         public event EventHandler AfterTap;
+
+        private ToolGridViewModel _viewModel = new();
+        
+        public void BeginUpdate()
+        {
+            _viewModel?.BeginUpdate();
+        }
+
+        public void EndUpdate()
+        {
+            _viewModel.EndUpdate();
+        }
         
         public MobileToolGrid()
         {
+            _viewModel.LayoutChanged += _viewModel_OnLayoutChanged;
+            BeginUpdate();
             InitializeComponent();
-            BindableLayout.SetItemsSource(_flexgrid, _viewModel.VisibleItems);
+            EndUpdate();
         }
 
         public void Refresh()
@@ -144,6 +183,8 @@ namespace InABox.Mobile
             _flexgrid.ColumnDefinitions.Clear();
             for (int i=0; i< args.ColCount; i++)
                 _flexgrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star});
+            BindableLayout.SetItemsSource(_flexgrid, null);
+            BindableLayout.SetItemsSource(_flexgrid, _viewModel.VisibleItems);
 
         }
         

+ 20 - 2
InABox.Mobile/InABox.Mobile.Shared/Components/MobileToolGrid/MobileToolItem.cs

@@ -81,7 +81,11 @@ namespace InABox.Mobile
         public bool IsEnabled
         {
             get { return (bool)GetValue(IsEnabledProperty); }
-            set { SetValue(IsEnabledProperty, value); }
+            set
+            {
+                SetValue(IsEnabledProperty, value);
+                DoChanged();
+            }
         }
         
                         
@@ -89,7 +93,11 @@ namespace InABox.Mobile
         public bool IsVisible
         {
             get { return (bool)GetValue(IsVisibleProperty); }
-            set { SetValue(IsVisibleProperty, value); }
+            set
+            {
+                SetValue(IsVisibleProperty, value);
+                DoChanged();
+            }
         }
         
                                 
@@ -116,6 +124,16 @@ namespace InABox.Mobile
 	        Clicked?.Invoke(this, EventArgs.Empty);
         }
         
+                
+        public event EventHandler Changed;
+
+        public void DoChanged()
+        {
+            Changed?.Invoke(this, EventArgs.Empty);
+        }
+
+
+
     }
 
 }

+ 2 - 0
InABox.Mobile/InABox.Mobile.Shared/DataModels/CoreRepository.cs

@@ -44,6 +44,8 @@ namespace InABox.Mobile
             var result = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
             if (CacheID != Guid.Empty)
                 result = Path.Combine(result,CacheID.ToString());
+            if (!Directory.Exists(result))
+                Directory.CreateDirectory(result);
             return result;
         }