gpt4 book ai didi

listview - Xamarin.Forms - ListView 未在 OnAppearing 方法中更新

转载 作者:行者123 更新时间:2023-12-02 22:13:53 25 4
gpt4 key购买 nike

我正在使用 Xamarin.Forms 开发一个应用程序,我有一个屏幕,用户可以在其中发布源更新,此源更新包含文本和一些附加文件。我的 xaml View 基本上是一个 StackLayout,其中包含一个 ListViewEditor 和几个 Buttons。问题是我试图在 onAppearing 方法中设置我的 ListViewItemSource 。该方法被调用得很好。我设置的集合会按预期更改。但由于某种原因,ListView 没有更新。在设置 Source 调用 Editor focus 方法后,可以立即使用使 ListView 正常工作的解决方法。我这样做是因为我发现当我在集合设置后单击编辑器时,ListView 会正确呈现。但这是一个非常令人讨厌的解决方法。

这是我的 xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="HalliganTL.View.UpdateFeedPage">
<StackLayout Orientation="Vertical" >
<ListView x:Name="AttachedFilesListView" MinimumHeightRequest="50" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout HorizontalOptions="StartAndExpand" Orientation="Horizontal">
<Button Text="[X]" />
<StackLayout Padding="5,0,0,0" VerticalOptions="StartAndExpand" Orientation="Vertical">
<Label Text="{Binding Name}" VerticalTextAlignment="Center" FontSize="Medium" />
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Editor x:Name="UpdateFeedEditor" FontSize="15" Text="{Binding PostText}" VerticalOptions="FillAndExpand" />
<Button Text="Attach file" TextColor="White" BackgroundColor="#77D065" Clicked="onAttachFileClicked"/>
<Button Text="Post" TextColor="White" BackgroundColor="#77D065" Clicked="onPostClicked"/>
</StackLayout>
</ContentPage>

这是我的页面代码:

public partial class UpdateFeedPage : ContentPage
{
public static List<FileObject> CurrentSelectedFile = new List<FileObject>();
public static string PostText = "";

public UpdateFeedPage()
{
InitializeComponent();
Title = "New Update";
UpdateFeedEditor.Text = PostText;
}

protected override void OnAppearing()
{
AttachedFilesListView.ItemsSource = CurrentSelectedFile;
UpdateFeedEditor.Focus();
base.OnAppearing();
}

async void onPostClicked(object sender, EventArgs e)
{
await Navigation.PopAsync();
}

async void onAttachFileClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new FilePickerPage());
}
}

我玩过很多东西,比如:

  • 更改 ListView 和包含 ListView 的 StackLayout 的 Horizo​​ntalOptions 和 VerticalOptions。

  • 删除了除 StackLayout 和子 ListView 之外的所有其他控件。

但到目前为止,除了以编程方式调用 Editor、Focus 方法之外,没有任何效果

注意:

正如您所看到的,我设置的 ListView 集合是静态的,我直接从另一个页面修改该集合,但我认为这没问题,因为当我在 OnAppearing 中设置断点时,集合已被正确修改。

最佳答案

解决刷新问题的两种方法。

第一种方式)

强制 ListView 从 List<FileObject> 刷新通过重置ItemsSource来收集:

当前:

protected override void OnAppearing()
{
AttachedFilesListView.ItemsSource = CurrentSelectedFile;
UpdateFeedEditor.Focus();
base.OnAppearing();
}

更改为:

protected override void OnAppearing()
{
base.OnAppearing();
AttachedFilesListView.ItemsSource = null;
AttachedFilesListView.ItemsSource = CurrentSelectedFile;
}

第二种方式)

替换您的List<FileObject>集合 ObservableCollection<FileObject>因此更改通过 NotifyCollectionChangedAction.Add|Remove|... 发布基于事件ListView会听。

当前:

public static List<FileObject> CurrentSelectedFile = new List<FileObject>();

更改为:

public static readonly ObservableCollection<FileObject> CurrentSelectedFile = new ObservableCollection<FileObject>();

注意:还要添加 using System.Collections.ObjectModel;

您的OnAppearing变成:

protected override void OnAppearing()
{
base.OnAppearing();
AttachedFilesListView.ItemsSource = CurrentSelectedFile;
}

关于listview - Xamarin.Forms - ListView 未在 OnAppearing 方法中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37400239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com