ListView不更新尽管ItemsSource绑定到ObservableCollection &g



我试图创建一个ListView来显示一堆自定义单元格,当我修改其内容时,我需要它更新。我已经将它的ItemsSource绑定到一个ObservableCollection,并且我有一个方法可以在需要时更新这个集合。当我将元素添加到使用Settings插件存储的持久集合时,或者当页面出现时,因为我也可以从另一个页面修改该持久集合时,将调用此方法。然而,ListView不会更新,除非我切换到我的应用程序的另一个选项卡之前回来。

下面是我的代码:

ViewModel:

public ObservableCollection<ViewCell> Cells { get; set; }
public PlugManagerViewModel()
{
Title = "Mes prises";
Cells = new ObservableCollection<ViewCell>();
}
public void RefreshPlugList()
{
Cells.Clear();
foreach ((string name, string desc, _) in Settings.PlugListContent)
{
CustomCell cell = new CustomCell
{
Title = name,
Detail = desc
};
Cells.Add(cell);
}
}

XAML:

<ListView x:Name="plugList" x:FieldModifier="public" VerticalScrollBarVisibility="Default" SelectionMode="None" RowHeight="90" VerticalOptions="FillAndExpand" ItemSelected="OpenPlugDetail" ItemsSource="{Binding Cells}">
<ListView.ItemTemplate>
<DataTemplate>
<models:CustomCell Title="{Binding Title}" Detail="{Binding Detail}"></models:CustomCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

XAML.cs:

PlugManagerViewModel _viewModel;
public PlugManagerPage()
{
InitializeComponent();
_viewModel = (PlugManagerViewModel)this.BindingContext;
}
protected override void OnAppearing()
{
base.OnAppearing();
_viewModel.RefreshPlugList();
}
public async void AddPlug(object sender, EventArgs e)
{
//Code to modify Settings.PlugListContent
_viewModel.RefreshPlugList();
}
public async void OpenPlugDetail(object sender, SelectedItemChangedEventArgs e)
{
//Code to change page and reset selected item
}

我已经查了一堆其他线程,我找不到一个工作的解决方案。是我的绑定坏了还是别的什么?

我认为ItemSource在你的示例中应该是()应该是ViewCell.

其他建议:

  1. 使用CollectionView代替Listview ->CollectionView-Docs
  2. 用另一个词代替误导性的">ViewCell">
  3. 正如用户Guangyu提到的-如果你不重写onappering()-方法,不要使用它。

方法OnAppearing()仅在页面变得可见之前被触发。这就是为什么ListView不会更新,除非你切换到另一个选项卡,然后再切换回来。

您可以停止使用OnAppearing()方法来加载数据以解决此问题。可以通过ObservableCollectionOnPropertyChanged加载数据

您可以查看Page。方法获取更多信息。

最新更新