【问题标题】:After update of ObservableCollection Xamarin.Forms ListView sends null events更新 ObservableCollection Xamarin.Forms ListView 后发送空事件
【发布时间】:2018-06-14 06:16:34
【问题描述】:

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

我在 Xamarin.Forms 页面中遇到以下情况: 一个类似页面的 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 的重要概念,或者是否有其他以错误方式实现的东西?

【问题讨论】:

    标签: c# listview xamarin xamarin.forms


    【解决方案1】:

    通常,当我将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();
        }
    }
    

    【讨论】:

    • 感谢您的回复!但是,如果我将我的实现从ItemSelected 更改为建议的SelectedItem 实现,我仍然会遇到同样的问题。在这种情况下,在第一次更改 Items 之后,如果我选择一个项目,我会得到 value 始终是 null
    • 奇怪......我仍然觉得有点奇怪的是你在集合的属性获取器中“添加”项目。我将有代码在 getter 之外以某种方法清除和添加新项目。这意味着 getter 只会返回项目。
    • 是的,你是对的。属性 getter 内部的这种实现并不美观,应该在方法外部将读取数据与实际设置数据分开。不幸的是,这似乎也不是问题的根本原因。
    【解决方案2】:

    最终发现是 Xamarin.Forms 中的一个 bug,在 3.1.0 版本中已经解决。

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

    • [UWP] Xamarin 表单列表视图 SelectedItem 在绑定到 UWP 中的 ObservableCollection 时不起作用 (#3017)
    • [UWP] UWP 的 Xamarin.Forms 3.1 ListView ItemTapped 事件问题。 (#2996)

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多