我使用listview以xamarin形式显示联系人号码。在单击任何单元格时,我想更改该特定单元格的内容。以下是我的代码:
lst_view.ItemSelected += async (object sender, SelectedItemChangedEventArgs e) =>
{
var con =(Contact)e.SelectedItem;
int index=contactList.IndexOf(con);
if (con.is_selected)
{
contactList[index].is_selected = false;
contactList[index].img = "";
}
else{
contactList[index].is_selected = true;
contactList[index].img = "selected_checkbox.jpeg";
}
lst_view.ItemTemplate = new DataTemplate(typeof(ContactsItemCell));
};
它工作正常,但最后我给新的datatemplate点击单元格整个listview重绘,这是烦人的经验。我只是想更新那个单元格,而不是整个列表视图。顺便点一下,我正在通过与valueconverter绑定来更改该单元格的图像。
答案 0 :(得分:1)
从您显示的代码中,有一种更简单的方法可以在不更改ListView.ItemTemplate的情况下执行此操作。看起来你正试图让ListView中的SelectedItem将它的状态改为" Selected"显示复选框图像的状态。
这应该通过利用Xamarin.Forms.ViewCell类中的OnBindingContext覆盖来完成。在此覆盖中,您可以访问ViewCell的BindingContext,它是要显示的信息的模型。在这里你应该检查" is_selected"属性并将Image设置为ListView.ViewCell,以存储在应用程序中的相应图像。
要在ItemSelected中更新更改,您需要为ListView绑定的Collection调用OnPropertyChanged。您更改SelectedItem模型的方式是正确的,但您需要确保在源数据集合中发生这种情况。调用OnPropertyChanged将触发Xamarin.Forms从绑定源更新ViewCells。
如果您需要显示完全不同的ViewCells(而不仅仅是更改所选图像),则不应在ItemSelected事件处理程序中更新ListView的ItemTemplate,并且不应该更改ItemTemplate。您应该创建一个DataTemplateSelector。您可以根据要显示的模型对象提供DataTemplate。
我希望这有帮助!
披露:我为Xamarin / Microsoft工作