![](/img/trans.png)
[英]Parse JSON API from Dictionary to ObservableCollection for ListView in Xamarin.Forms
[英]After update of ObservableCollection Xamarin.Forms ListView sends null events
由于以下方法似乎不起作用,因此我可能会错过更新Xamarin.Forms ListView的中心概念。 也许您可以提供帮助,如何正确完成它。
我在Xamarin.Forms页面中遇到以下情况:一个类似List的ListView:
<ListView x:Name="listView" Margin="0" ItemSelected="OnListItemSelected" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
...
</ListView.ItemTemplate>
</ListView>
此ListView的绑定连接到ViewModel中的Items,该外观基本上如下所示:
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)
{
...
}
}
现在,在第一次绑定之后,一切正常。 但是,如果Items更改了List,它仍然可以正确更新,但是,如果我在列表上选择了Item,则仍将调用OnListItemSelected方法,但是e.SelectedItem始终为null。
在Xamarin.Forms 3.0.0 Service Release 1之前,一切正常,但是从Service Release 2开始,它不再起作用。
我是否错过了更新ListView的重要概念,或者是否有其他以错误方式实现的东西?
通常,当我对ItemsSource
使用Binding
时,我也会对SelectedItem
使用Binding
。 这样,您无需进行任何方法/事件连接。
因此在您的示例中,请在您的视图中执行以下操作:
<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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.