C# 删除和更改ListView视图单元格中的项目

C# 删除和更改ListView视图单元格中的项目,c#,listview,xamarin,xamarin.forms,C#,Listview,Xamarin,Xamarin.forms,在我正在编写的项目中,我试图这样做,如果用户单击一个选项图标,它会打开一个菜单,用户可以在其中选择删除帖子,并将其从列表中删除,我还想这样做,如果用户单击类似按钮,它会更改图标 我的问题是,我无法找到如何将变量附加到该ViewCell,以便在方法中可以删除它或更新like按钮 我的列表视图是 <ListView x:Name="MessageView" HasUnevenRows="True" IsPullToRefreshEnabled="True" Refreshing="Messag

在我正在编写的项目中,我试图这样做,如果用户单击一个选项图标,它会打开一个菜单,用户可以在其中选择删除帖子,并将其从列表中删除,我还想这样做,如果用户单击类似按钮,它会更改图标

我的问题是,我无法找到如何将变量附加到该ViewCell,以便在方法中可以删除它或更新like按钮

我的列表视图是

<ListView x:Name="MessageView" HasUnevenRows="True" IsPullToRefreshEnabled="True" Refreshing="MessageView_Refreshing">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout x:Name="MessageLayout" BackgroundColor="White" Margin="10, 10, 10, 0" Padding="10, 10, 15, 10">
                            <Image Source="options_icon.png" HeightRequest="15" HorizontalOptions="End" Margin="0, 0, 10, 0">
                                <Image.GestureRecognizers>
                                    <TapGestureRecognizer Command="{Binding OptionClick}"/>
                                </Image.GestureRecognizers>
                            </Image>
                            <Label Text="{Binding Body}" HorizontalOptions="CenterAndExpand" TextColor="Black" FontSize="15" Margin="0, 10, 0, 10"/>
                            <StackLayout x:Name="MessageFooter" Orientation="Horizontal">
                                <Image x:Name="LikeSource" Source="{Binding LikeImageSource}" HeightRequest="18" HorizontalOptions="StartAndExpand" Margin="0, 0, 10, 0">
                                    <Image.GestureRecognizers>
                                        <TapGestureRecognizer Command="{Binding LikeClick}" CommandParameter="{Binding .}"/>
                                    </Image.GestureRecognizers>
                                </Image>
                                <Label Text="{Binding Timestamp}" TextColor="Black" FontSize="10" HorizontalOptions="EndAndExpand"/>
                            </StackLayout>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

然后是它背后的代码

        public IList<MessageObject> FormatPosts(Page page, INavigation navigation, string json)
    {
        IList<MessageObject> Posts = new List<MessageObject>() { };
        var messages = JsonConvert.DeserializeObject<List<Message>>(json);

        foreach (var message in messages)
        {
            DateTime dateFormat = Convert.ToDateTime(message.TimeStamp);
            Posts.Add(new MessageObject
            {
                Body = message.Body,
                OptionClick = new Command(() => ShowOptionActions(page, navigation, message.Id, message.Sender_Id)),
                ImageSource = message.Liked == 0 ? "like_icon.png" : "liked_icon.png",
                LikeClick = new Command(async (sender) => await LikeMessage(navigation, message.Sender_Id, sender)),,
                Timestamp = dateFormat.ToString("MMMM dd, yyyy HH:mm")
            });
        }

        return Posts;
    }

    public static async void ShowOptionActions(Page page, INavigation navigation, int id, int poster_id)
    {
        var action = await page.DisplayActionSheet("Message Actions", "Cancel", "Delete");
        switch (action)
        {
            case "Delete":
                await DeleteMessage(page, navigation, id);
                break;
        }
    }

    public static async Task LikeMessage(INavigation navigation, int id, object message)
    {
  *Updates database*
if (page_result.Equals("liked"))
        {
            ((MessageObject)message).LikeImageSource = "liked_icon.png";
        }
        else if (page_result.Equals("unliked"))
        {
            ((MessageObject)message).LikeImageSource = "like_icon.png"; // same as when you haven't liked it yet
        }
}

    public static async Task DeleteMessage(Page page, INavigation navigation, int id)
    {
        *Deletes from database*
        //Delete post
            return;

    }

}

public class MessageObject
{
    public string Body { get; set; }
    public Command OptionClick { get; set; }
    public Command LikeClick { get; set; }
    public string Timestamp { get; set; }
    public string ImageSource { get; set; }
}
public IList formattposts(页面,激活导航,字符串json)
{
IList Posts=新列表(){};
var messages=JsonConvert.DeserializeObject(json);
foreach(消息中的var消息)
{
DateTime dateFormat=Convert.ToDateTime(message.TimeStamp);
添加(新消息对象)
{
Body=message.Body,
OptionClick=new命令(()=>ShowOptionActions(页面、导航、message.Id、message.Sender\u Id)),
ImageSource=message.Liked=0?“like_icon.png”:“Liked_icon.png”,
LikeClick=new命令(异步(发送方)=>wait-LikeMessage(导航,message.sender\u Id,发送方)),,
Timestamp=dateFormat.ToString(“MMMM-dd,yyyy-HH:mm”)
});
}
返回岗位;
}
公共静态异步void ShowOptionActions(第页,激活导航,int-id,int-poster\u-id)
{
var action=wait page.DisplayActionSheet(“消息操作”、“取消”、“删除”);
开关(动作)
{
案例“删除”:
等待删除消息(页面、导航、id);
打破
}
}
公共静态异步任务,如消息(活动导航、int-id、对象消息)
{
*更新数据库*
如果(第页结果等于(“喜欢”))
{
((MessageObject)message.LikeImageSource=“liked_icon.png”;
}
else if(第页结果等于(“未链接”))
{
((MessageObject)message.LikeImageSource=“like_icon.png”;//和您还不喜欢它时一样
}
}
公共静态异步任务DeleteMessage(第页,激活导航,int-id)
{
*从数据库中删除*
//删除帖子
返回;
}
}
公共类消息对象
{
公共字符串体{get;set;}
公共命令选项单击{get;set;}
公共命令,如单击{get;set;}
公共字符串时间戳{get;set;}
公共字符串ImageSource{get;set;}
}

这将把选定的MessageObject作为参数传递给OptionClick命令

<TapGestureRecognizer Command="{Binding OptionClick}" CommandParameter="{Binding .}"/>


我将如何使用它来更改图像源?如果您更新MessageObject ImageSource属性并使用INotifyPropertyChanged,它将自动更新我如何将INotifyPropertyChanged实现为我更新的代码?