Xamarin.Forms - 在OnAppearing方法中没有更新ListView

时间:2016-05-23 20:46:34

标签: listview xamarin xamarin.forms

我正在使用Xamarin.Forms开发一个应用程序,我有一个用户可以发布Feed更新的屏幕,此Feed更新包含文本和一些附加文件。我的xaml视图基本上是StackLayout,其中包含ListViewEditor以及一些Buttons。问题是我正在尝试在ItemSource方法中设置ListView的{​​{1}}。该方法被称为正常。我正在设置的集合按预期更改。但由于某种原因,onAppearing没有更新。在设置ListView调用ListView焦点方法后,使Source正常工作的解决方法是正确的。我这样做是因为我发现当我在设置集合后点击编辑器时,Editor正确呈现。但这是一个非常讨厌的解决方法。

这是我的xaml:

ListView

这是我的页面代码:

<?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>

我玩了很多东西,比如:

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

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

但到目前为止没有任何工作,除了以编程方式调用编辑器,Focus方法

注意:

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

1 个答案:

答案 0 :(得分:5)

修复该刷新问题的两种方法。

第一路)

通过重置List<FileObject>强制ListView从您的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;
}