主頁 > 軟體設計 > RefreshView不會停止重繪-XamarinForms

RefreshView不會停止重繪-XamarinForms

2022-05-09 05:41:52 軟體設計

對于我的 Xamarin Forms 應用程式,我正在開發一個日歷頁面。我有一個 No-SQL 資料庫設定和作業,我有我的主日歷視圖頁面 (EventManagerPage) 和此頁面的后端 (EventManagerViewPage)。

我面臨的問題是如何讓系統知道 RefreshView 正在重繪 ?

正常的 Xamarin.Forms.IsBusy 指示器無法正常作業,我的頁面將繼續重繪 而不會停止。在我下拉頁面重繪 并單擊日期后,我可以告訴日歷事件存在,因為它們出現在日歷下方,但日歷本身不顯示存在的事件(日期每個事件的藍色方塊)。

我的 ViewModel 基于擴展 INotifyPropertyChanged 介面和 BaseViewModel 的自定義日歷 ViewModel。

使用 IsBusy 不會導致拋出任何錯誤,也不會導致除錯輸出中出現任何消??息。我已經嘗試了一些其他方法來嘗試讓重新加載在完成后停止,但這些都導致了阻止應用程式編譯的錯誤。

到目前為止,我已經嘗試創建一個自定義布林值來充當 IsBusy Xamarin.Forms 指示器,但這導致在資料背景關系中找不到成員的錯誤。

我還嘗試按照Microsoft Doc on RefreshViews中的示例進行操作。這也導致在資料背景關系中找不到成員的錯誤并且我無法設定refreshView.Command = refreshCommand;(我不確定這是否對錯誤很重要)。

我把我的代碼放在下面。請注意,我使用的日歷是作者 MarvinE 的 Plugin.XCalendar。
我感謝任何人提供的任何幫助/建議!

CalendarBaseViewModel.cs

using MvvmHelpers;
using PropertyChanged;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace PPA.ViewModels
{
    [AddINotifyPropertyChangedInterface]
    public abstract class CalendarBaseViewModel : BaseViewModel, INotifyPropertyChanged
    {
        #region Events
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region Methods
        protected virtual void OnPropertyChanged([CallerMemberName] string PropertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }
        #endregion
    }
}

EventManagerViewModel.cs

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Windows.Input;
using Xamarin.CommunityToolkit.ObjectModel;
using Xamarin.Forms;
using PPA.Models;
using System.Threading.Tasks;
using PPA.Views;
using PPA.Services;
using System.Diagnostics;

namespace PPA.ViewModels
{
    public class EventManagerViewModel : CalendarBaseViewModel
    {
        #region Properties
        public ObservableRangeCollection<Event> Events { get; }
        public ObservableRangeCollection<DateTime> SelectedDates { get; }
        public ObservableRangeCollection<Event> SelectedEvents { get; }

        #endregion

        public AsyncCommand AddEventCommand { get; }
        public AsyncCommand LoadEventsCommand { get; }

        IEventDataStore EventService;

        #region Constructors
        public EventManagerViewModel()
        {
            AddEventCommand = new AsyncCommand(OnAddEvent);
            LoadEventsCommand = new AsyncCommand(LoadEvents);
            EventService = DependencyService.Get<IEventDataStore>();

            Events = new ObservableRangeCollection<Event>();
            SelectedDates = new ObservableRangeCollection<DateTime>(); 
            SelectedEvents = new ObservableRangeCollection<Event>();


            SelectedDates.CollectionChanged  = SelectedDates_CollectionChanged;

        }
        #endregion

        #region Methods
        private void SelectedDates_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            SelectedEvents.ReplaceRange(Events.Where(x => SelectedDates.Any(y => x.DateTime.Date == y.Date)).OrderByDescending(x => x.DateTime));
        }

        private async Task OnAddEvent()
        {
            await Shell.Current.GoToAsync(nameof(NewEventPage));
        }

        async Task LoadEvents()
        {
            IsBusy = true;
            // refreshview.IsRefreshing = true;
            try
            {
                Events.Clear();
                var events = await EventService.GetEventsAsync();
                foreach (var ev in events)
                {
                    Events.Add(ev);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
           IsBusy = false;
        } 
        


        public void OnAppearing()
        {
         IsBusy = true;
        }
        #endregion
    }
}

EventManagerPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Class="PPA.Views.EventManagerPage"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:Converters="clr-namespace:PPA.Converters"
    xmlns:Models="clr-namespace:PPA.Models"
    xmlns:ViewModels="clr-namespace:PPA.ViewModels"
    xmlns:xc="clr-namespace:XCalendar;assembly=XCalendar"
    xmlns:xcModels="clr-namespace:XCalendar.Models;assembly=XCalendar"
    xmlns:xct="http://xamarin.com/schemas/2020/toolkit" xmlns:xcConverters="clr-namespace:XCalendar.Converters;assembly=XCalendar" 
             x:DataType="ViewModels:EventManagerViewModel"
             x:Name="This"
    Title="Event Calendar"
    xct:SafeAreaEffect.SafeArea="True"
             >
    <ContentPage.Resources>
        <!--  Limits a string to a certain amount of characters  -->
        <xcConverters:StringCharLimitConverter x:Key="StringCharLimitConverter"/>
        <!--  Returns true if all bindings evaluate to true  -->
        <xct:VariableMultiValueConverter x:Key="AllTrueConverter" ConditionType="All"/>
        <!--  Inverts a binded boolean value  -->
        <xct:InvertedBoolConverter x:Key="InvertedBoolConverter"/>
    </ContentPage.Resources>
    <ContentPage.ToolbarItems>
        <ToolbarItem Text="Add" Command="{Binding AddEventCommand}" />
    </ContentPage.ToolbarItems>

    <RefreshView x:DataType="ViewModels:EventManagerViewModel" Command="{Binding LoadEventsCommand}" IsRefreshing="{Binding IsBusy, Mode=TwoWay}">
    <Grid
        ColumnSpacing="0"
        RowDefinitions="Auto,*"
        RowSpacing="0">

        <Frame
            Margin="10"
            Padding="0"
            BackgroundColor="White"
            CornerRadius="15">

            <xc:CalendarView
                x:Name="MainCalendarView"
                Grid.Row="0"
                DayNameTextColor="{StaticResource ContentTextColor}"
                NavigationArrowColor="{StaticResource ContentTextColor}"
                NavigationBackgroundColor="Transparent"
                NavigationTextColor="{StaticResource ContentTextColor}"
                SelectedDates="{Binding SelectedDates}"
                SelectionAction="Modify"
                SelectionType="Single">

                <xc:CalendarView.DayTemplate>
                    <DataTemplate x:DataType="{x:Type xcModels:CalendarDay}">
                        <!--  ContentView so that the margin is respected by the MonthView  -->
                        <ContentView>
                            <xc:CalendarDayView
                                Margin="2.5"
                                HeightRequest="43"
                                CalendarView="{Binding ., Source={x:Reference MainCalendarView}}"
                                CurrentMonthTextColor="{StaticResource CalendarBackgroundTextColor}"
                                DateTime="{Binding DateTime}"
                                OutOfRangeTextColor="{StaticResource CalendarTertiaryColor}"
                                SelectedTextColor="{StaticResource CalendarPrimaryTextColor}"
                                TodayBorderColor="{StaticResource CalendarPrimaryColor}"
                                TodayTextColor="{StaticResource CalendarBackgroundTextColor}">

                                <xc:CalendarDayView.ControlTemplate>
                                    <ControlTemplate>
                                        <!--  Using a Grid to stack views on the z axis  -->
                                        <Grid RowSpacing="2">

                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="1.5*"/>
                                                <RowDefinition/>
                                            </Grid.RowDefinitions>

                                            <!--  ContentPresenter displays the default content for the control  -->
                                            <ContentPresenter
                                                Grid.Row="0"
                                                Grid.RowSpan="2"
                                                VerticalOptions="Center"/>

                                            <StackLayout
                                                Grid.Row="1"
                                                HorizontalOptions="Center"
                                                Orientation="Horizontal"
                                                Spacing="2.5">

                                                <!--  I want the event indicators to only be visible when the DateTime is in the currently navigated month  -->
                                                <StackLayout.IsVisible>
                                                    <MultiBinding Converter="{StaticResource AllTrueConverter}">
                                                        <!--  TemplatedParent refers to the view that the ControlTemplate resides in  -->
                                                        <Binding Path="IsCurrentMonth" Source="{RelativeSource TemplatedParent}"/>
                                                        <Binding
                                                            Converter="{StaticResource InvertedBoolConverter}"
                                                            Path="IsOutOfRange"
                                                            Source="{RelativeSource TemplatedParent}"/>
                                                    </MultiBinding>
                                                </StackLayout.IsVisible>

                                                <BindableLayout.ItemsSource>
                                                    <Binding Path="DateTime.Date" Source="{RelativeSource TemplatedParent}">
                                                        <Binding.Converter>
                                                            <Converters:EventWhereConverter
                                                                Items="{Binding BindingContext.Events, Source={x:Reference This}}"
                                                                UseTimeComponent="False"
                                                                WhiteList="True"/>
                                                        </Binding.Converter>
                                                    </Binding>
                                                </BindableLayout.ItemsSource>

                                                <BindableLayout.ItemTemplate>
                                                    <DataTemplate x:DataType="{x:Type Models:Event}">
                                                        <BoxView
                                                            CornerRadius="100"
                                                            HeightRequest="7"
                                                            HorizontalOptions="CenterAndExpand"
                                                            VerticalOptions="Center"
                                                            WidthRequest="7"
                                                            Color="Blue"/>
                                                    </DataTemplate>
                                                </BindableLayout.ItemTemplate>

                                            </StackLayout>

                                        </Grid>
                                    </ControlTemplate>
                                </xc:CalendarDayView.ControlTemplate>

                            </xc:CalendarDayView>
                        </ContentView>
                    </DataTemplate>
                </xc:CalendarView.DayTemplate>

            </xc:CalendarView>

        </Frame>

        <CollectionView Grid.Row="1" ItemsSource="{Binding SelectedEvents}">

            <CollectionView.EmptyView>
                <Label
                    FontAttributes="Bold"
                    FontSize="20"
                    HorizontalTextAlignment="Center"
                    Text="No Events on Selected Date(s)"
                    TextColor="{StaticResource ContentTextColor}"
                    VerticalTextAlignment="Center"/>
            </CollectionView.EmptyView>
            <CollectionView.ItemsLayout>
                <LinearItemsLayout ItemSpacing="0" Orientation="Vertical"/>
            </CollectionView.ItemsLayout>

            <CollectionView.ItemTemplate>
                <DataTemplate x:DataType="{x:Type Models:Event}">
                    <ContentView Padding="5">
                        <Frame
                            Padding="0"
                            BackgroundColor="{StaticResource ContentBackgroundColor}"
                            CornerRadius="10">
                            <StackLayout Orientation="Horizontal" Spacing="0">
                                <BoxView BackgroundColor="CornflowerBlue" WidthRequest="20"/>

                                <StackLayout Padding="10" Spacing="0">
                                    <Label
                                        FontAttributes="Bold"
                                        FontSize="20"
                                        Text="{Binding DateTime, StringFormat='{0: dd MMMM HH:mm}'}"
                                        TextColor="{StaticResource ContentTextColor}"
                                        VerticalTextAlignment="Center"/>
                                    <Label
                                        FontSize="16"
                                        Text="{Binding Title}"
                                        TextColor="{StaticResource ContentTextColor}"
                                        Margin="5,0,0,0"/>
                                    <Label
                                        Margin="5,10,0,0"
                                        FontSize="14"
                                        Text="{Binding Description}"
                                        TextColor="{StaticResource ContentTextColor}"/>
                                </StackLayout>
                            </StackLayout>
                        </Frame>
                    </ContentView>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

    </Grid>
     </RefreshView>
</ContentPage>

EventManagerPage.xaml.cs

using PPA.ViewModels;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace PPA.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]

    public partial class EventManagerPage : ContentPage
    {
        EventManagerViewModel _viewModel;
        public EventManagerPage()
        {

            InitializeComponent();
            BindingContext = _viewModel = new EventManagerViewModel();
            
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            _viewModel.OnAppearing();
        }
    }
}

uj5u.com熱心網友回復:

您是否在 ViewModel 中為“IsBusy”創建了系結屬性,如下所示:

    private bool _isBusy;
    public bool IsBusy
    {
        get
        {
            return _isBusy;
        }
        set
        {
            _isBusy = value;
            OnPropertyChanged("IsBusy");
        }
    }

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/470499.html

標籤:C# xamarin xamarin.forms

上一篇:使用Shell時如何在Xamarin.Forms中設定導航文本顏色

下一篇:可以獲得令牌,但既不會收到推送通知也不會收到靜默通知

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more