更新 ObservableCollection Xamarin.Forms ListView 后,将发送空事件



由于以下方法似乎不起作用,我可能会错过更新Xamarin.Forms ListView的中心概念。也许你可以帮忙,应该如何正确地完成。

我在Xamarin.Forms页面中遇到了以下情况: 一个列表视图,就像页面上的这样:

<ListView x:Name="listView" Margin="0" ItemSelected="OnListItemSelected" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>

此列表视图的绑定连接到视图模型中的项,其基本如下所示:

private ObservableCollection<Item> items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items
{
get
{
items.Clear();
if (SomeSingeltonSource != null)
{
IEnumerable<Item> current = SomeSingeltonSource.GetCurrentItems(viewModelState);
foreach (Item wf in current)
{
items.Add(wf);
}
}
return items;
}
}

在 ItemSelected 上调用的方法开始如下:

void OnListItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem is Item selectedItem)
{
...
}
}

现在在第一次绑定之后,一切正常。 但是,如果项目更改,列表仍然正确更新,但是如果我在列表中选择一个项目,仍然调用 OnListItemSelected 方法,但是 e.SelectedItem 始终为空。

在 Xamarin.Forms 3.0.0 服务版本 1 之前一切正常,但自服务版本 2 以来,它不再工作。

我是否错过了更新 ListView 的重要概念,或者是否有其他内容以错误的方式暗示?

一般当我使用Binding表示ItemsSource时,我也会使用Binding表示SelectedItem。 这样你就不需要任何方法/事件连接。

因此,在您的示例中,请在您的视图中执行此操作:

<ListView x:Name="listView" Margin="0" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>

并在绑定上下文代码中添加一个额外的属性,如下所示:

private Item _selectedItem;
public Item SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value; // TODO: Add extra code to trigger something because the user selected an item
OnNotifyPropertyChanged();
}
}

最后,事实证明,这是Xamarin.Forms中的一个错误,该错误已在3.1.0版本中解决。

如果您对详细信息感兴趣,请查看以下问题:

  • [UWP] Xamarin 窗体列表视图选定项在绑定到 UWP 中的可观察集合时不起作用 (#3017(
  • [UWP] Xamarin.Forms 3.1 ListView ItemTapped UWP 事件问题。(#2996(

最新更新