我试图创建一个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.
其他建议:
- 使用CollectionView代替Listview ->CollectionView-Docs
- 用另一个词代替误导性的">ViewCell">
- 正如用户Guangyu提到的-如果你不重写onappering()-方法,不要使用它。
方法OnAppearing()
仅在页面变得可见之前被触发。这就是为什么ListView不会更新,除非你切换到另一个选项卡,然后再切换回来。
您可以停止使用OnAppearing()
方法来加载数据以解决此问题。可以通过ObservableCollection
和OnPropertyChanged
加载数据
您可以查看Page。方法获取更多信息。