我正在使用Xamarin.Forms开发一个应用程序,我有一个用户可以发布Feed更新的屏幕,此Feed更新包含文本和一些附加文件。我的xaml视图基本上是StackLayout
,其中包含ListView
和Editor
以及一些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更改HorizontalOptions和VerticalOptions。
删除除StackLayout和子ListView之外的所有其他控件。
但到目前为止没有任何工作,除了以编程方式调用编辑器,Focus方法
注意:
正如您所看到的,我设置的ListView集合是静态的,我直接从另一个页面修改该集合,但我认为没关系,因为当我在OnAppearing中设置断点时,正在正确地修改集合。
答案 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;
}