ListView 未删除 Xamarin.Forms 中的项目。我已将 ObservableCollection 分配给 ListView itemssource。 MVVM

ListView not deleting items in Xamarin.Forms. I have assigned an ObservableCollection to the ListView itemsource. MVVM

在我的 Xamarin.Forms 应用程序中,我有一个简单的联系人 class [模型]。在 UI [View] 中存在一个显示联系人的 ListView。在我的模型视图 class 中,我有一个分配给 ListView 的 itemSource 属性 的联系人列表 (_listOfContacts)。此联系人列表是一个 ObservableCollection。我的问题是,当用户从 ContextActions 单击“删除”时,我可以看到 _listOfContacts 已更新,但 ListView 未更新。 ListView 仅在我将其项目源重新分配给 _listOfContacts 时才会更新。如果 _listOfContacts 是联系人的 ObservableCollection,则不需要这样做。 我是 MVVM 的新手,所以在继续学习更高级的技术之前,我需要清除这些基本的 MVVM 概念。 这是我的代码:

型号

 class Contact
{
    public String Name { get; set; }
    public String Status { get; set; }
    public String ImageUrl { get; set; }
}

模型视图

public partial class ContactListPage : ContentPage
{
    private ObservableCollection<Contact> _listOfContacts;
    public ContactListPage()
    {
        InitializeComponent();

        _listOfContacts = new ObservableCollection<Contact>
        {
           new Contact {Name="Item1", ImageUrl="http://lorempixel.com/100/100/people/1" , Status="Hey"},
            new Contact { Name = "Item2", ImageUrl = "http://lorempixel.com/100/100/people/2", Status="Hey" },
        };

        contactList.ItemsSource = _listOfContacts.ToList();
    }

    private void EditContactClick(object sender, EventArgs e)
    {
        DisplayAlert("Alert", "Clicked Edit", "Cancel");
    }

    private void DeleteContactClick(object sender, EventArgs e)
    {
        var contact = (sender as MenuItem).CommandParameter as Contact;
        _listOfContacts.Remove(contact);
//following line of code should not be needed since _listOfContacts is 
//an ObservableCollection and removing an item should update the bound control automatically
        **contactList.ItemsSource = _listOfContacts.ToList();**
    }
}

查看

<ContentPage.Content>
    <StackLayout>
        <ListView x:Name="contactList" HasUnevenRows="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" Padding="10">
                            <Image Source="{Binding ImageUrl}"/>
                            <StackLayout HorizontalOptions="StartAndExpand">
                                <Label Text="{Binding Name}" Margin="0,2,0,2"/>
                                <Label Text="{Binding Status}" Margin="0,2,0,2" />
                            </StackLayout>
                        </StackLayout>
                        <ViewCell.ContextActions>
                            <MenuItem Text="Edit" Clicked="EditContactClick" CommandParameter="{Binding .}"/>
                            <MenuItem Text="Delete" Clicked="DeleteContactClick" IsDestructive="True" CommandParameter="{Binding .}"/>
                        </ViewCell.ContextActions>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>
    </StackLayout>
</ContentPage.Content>

contactList.ItemsSource = _listOfContacts.ToList(); 中删除 .toList(),然后重试。

_listOfContacts 是一个 ObservableCollection,应该直接用作您的 ItemsSource。也许去看看 ObservableCollection documentation

我测试了你的代码,正是方法ToList()导致了这个问题:

 contactList.ItemsSource = _listOfContacts.ToList();

一开始,_listOfContacts的类型是ObservableCollection,但是当你使用ToList()方法时,又会转为List。 所以只要删除方法'ToList()',你的代码就可以正常工作了,如下:

contactList.ItemsSource = _listOfContacts;