首页 > 解决方案 > 每 x 秒刷新 xaml 页面并保持当前扩展器状态

问题描述

我有一个 xamarin 项目。有一个带有扩展器列表的滚动视图。

我喜欢每 x 秒刷新一次页面,但保持扩展器的状态(isExpanded 布尔值)。

如何检查扩展器(或标签、按钮等)的状态并在每 x 秒刷新一次时保留这些值?

我觉得我必须在我的后台代码函数中添加一个参数,类似于点击或单击事件期间的“对象发送者”。

在后面的代码中,我尝试每 x 秒刷新一次页面

Device.StartTimer(TimeSpan.FromSeconds(x),Updatefunction);

目前,当页面刷新时,它们都具有默认的 isExpanded (false) 状态。

标签: xamlxamarin.formsrefreshexpander

解决方案


您可以在 viewModel 中添加一个 bool 属性,然后将此属性绑定到IsExpanded="{Binding Expand1Opened}"选项卡中<Expander>。当用户单击 时Expander,IsExpanded 将取决于Expand1Opened属性的值。无论每 x 秒刷新一次页面,它都会保持当前的扩展器状态。我添加CommandExpander,如果Expander单击,Expand1Opened属性的值将在 ViewModel 中更改。

 <RefreshView IsRefreshing="{Binding IsRefreshing}"
                     RefreshColor="Teal"
                     Command="{Binding RefreshCommand}">
            <ScrollView>
                <StackLayout>
                    <Expander IsExpanded="{Binding Expand1Opened}" Command="{Binding Expand1OpenedCommand}">
                    <Expander.Header>
                        <Label Text="List1"
               FontAttributes="Bold"
               FontSize="Medium" />
                    </Expander.Header>
                    <Grid Padding="10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <FlexLayout Direction="Row"
                            Wrap="Wrap"
                            AlignItems="Center"
                            AlignContent="Center"
                            BindableLayout.ItemsSource="{Binding Items}"
                            BindableLayout.ItemTemplate="{StaticResource ColorItemTemplate}" />
                    </Grid>
                </Expander>

                    <Expander IsExpanded="{Binding Expand2Opened}" Command="{Binding Expand2OpenedCommand}">
                    <Expander.Header>
                        <Label Text="List2"
               FontAttributes="Bold"
               FontSize="Medium" />
                    </Expander.Header>
                    <Grid Padding="10">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <FlexLayout Direction="Row"
                            Wrap="Wrap"
                            AlignItems="Center"
                            AlignContent="Center"
                            BindableLayout.ItemsSource="{Binding Items}"
                            BindableLayout.ItemTemplate="{StaticResource ColorItemTemplate}" />
                    </Grid>
                </Expander>
                </StackLayout>

            </ScrollView>
        </RefreshView>

这是视图模型。我有两个<Expander>,所以我添加两个属性Expand1Openedand Expand2Opened,并添加两个Commands调用Expand1OpenedCommandand Expand2OpenedCommand,如果<Expander>被点击,Expand1OpenedCommand将被调用,那么值Expand1Opened会改变,如果刷新视图被刷新,值Expand1Opened不会改变,expander所以状态将被保留。

 public class MainPageViewModel : INotifyPropertyChanged
    {
        const int RefreshDuration = 2;
        int itemNumber = 1;
        readonly Random random;
        bool isRefreshing;

        public bool IsRefreshing
        {
            get { return isRefreshing; }
            set
            {
                isRefreshing = value;
                OnPropertyChanged();
            }
        }

        bool expand1Opened = false;
        public bool Expand1Opened
        {
            get { return expand1Opened; }
            set
            {
                expand1Opened = value;
                OnPropertyChanged();
            }
        }

        bool expand2Opened=false;
        public bool Expand2Opened
        {
            get { return expand2Opened; }
            set
            {
                expand2Opened = value;
                OnPropertyChanged();
            }
        }
        public ObservableCollection<Item> Items { get; private set; }

        public ICommand RefreshCommand => new Command(async () => await RefreshItemsAsync());

        public ICommand Expand1OpenedCommand { get; set; }
        public ICommand Expand2OpenedCommand { get; set; }
        public MainPageViewModel()
        {
            random = new Random();
            Items = new ObservableCollection<Item>();

            Expand1OpenedCommand = new Command((() =>
            {
                expand1Opened = !expand1Opened;
            }));
            Expand2OpenedCommand = new Command((() =>
            {
                expand2Opened = !expand2Opened;
            }));


            AddItems();
        }

        void AddItems()
        {
            for (int i = 0; i < 1; i++)
            {
                Items.Add(new Item
                {
                    Color = Color.FromRgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)),
                    Name = $"Item {itemNumber++}",
                    Isfavourite = false

                }); 
            }
        }

        async Task RefreshItemsAsync()
        {
            IsRefreshing = true;
            await Task.Delay(TimeSpan.FromSeconds(RefreshDuration));
            AddItems();
            IsRefreshing = false;
        }

        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }
}

这里正在运行 GIF。

在此处输入图像描述


推荐阅读