xaml - 每 x 秒刷新 xaml 页面并保持当前扩展器状态
问题描述
我有一个 xamarin 项目。有一个带有扩展器列表的滚动视图。
我喜欢每 x 秒刷新一次页面,但保持扩展器的状态(isExpanded 布尔值)。
如何检查扩展器(或标签、按钮等)的状态并在每 x 秒刷新一次时保留这些值?
我觉得我必须在我的后台代码函数中添加一个参数,类似于点击或单击事件期间的“对象发送者”。
在后面的代码中,我尝试每 x 秒刷新一次页面
Device.StartTimer(TimeSpan.FromSeconds(x),Updatefunction);
目前,当页面刷新时,它们都具有默认的 isExpanded (false) 状态。
解决方案
您可以在 viewModel 中添加一个 bool 属性,然后将此属性绑定到IsExpanded="{Binding Expand1Opened}"
选项卡中<Expander>
。当用户单击 时Expander
,IsExpanded 将取决于Expand1Opened
属性的值。无论每 x 秒刷新一次页面,它都会保持当前的扩展器状态。我添加Command
了Expander
,如果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>
,所以我添加两个属性Expand1Opened
and Expand2Opened
,并添加两个Command
s调用Expand1OpenedCommand
and 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。
推荐阅读
- apache - C:/Apache24/conf/httpd.conf: Include 接受一个参数,要包含的配置文件的名称
- laravel - API 验证 laravel 5.7
- protractor - 在量角器中同时运行浏览器命令
- python - 需要快速更新 Django 模型与其他两个模型之间的差异
- gradle - 未找到 ID 为“com.github.spotbugs”的插件
- networking - Kubernetes nodeport 并发连接限制
- d3.js - 刷子移动时如何处理填充物
- prolog - 递归变量赋值
- php - 如何通过 HTML 表格显示多个数据库值的数值
- python - 在神经网络中逼近激活函数时溢出