如何在自定义渲染xamarin表单中处理覆盖行选定事件

如何在自定义渲染xamarin表单中处理覆盖行选定事件,xamarin,xamarin.ios,xamarin.android,xamarin.forms,Xamarin,Xamarin.ios,Xamarin.android,Xamarin.forms,我想在自定义渲染器中重写下面的方法。我所要做的就是显示或隐藏“选择”和“取消选择”上的复选标记 public override void RowSelected (UITableView tableView, NSIndexPath indexPath) { // Do something } 下面是自定义渲染器代码 我想做下面这样的事情。我应该重写什么方法来实现这一点 public override UIKit.UITableViewCell RowSelected(Cell

我想在自定义渲染器中重写下面的方法。我所要做的就是显示或隐藏“选择”和“取消选择”上的复选标记

public override void RowSelected (UITableView tableView, NSIndexPath   indexPath)
{
 // Do something
}
下面是自定义渲染器代码 我想做下面这样的事情。我应该重写什么方法来实现这一点

    public override UIKit.UITableViewCell RowSelected(Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
    {
        var cell = base.GetCell(item, reusableCell, tv);
        cell.Accessory=UIKit.UITableViewCellAccessory.Checkmark;
        return cell;
     }


}

如何实现这一点?

最简单的方法是在自定义的
ListViewRenderer
中使用
UITableViewDelegate
子类:

public class CheckedListViewRenderer : ListViewRenderer
{
    class CheckedUITableViewDelegate : UITableViewDelegate
    {
        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
            var cell = tableView.CellAt(indexPath);
            cell.Accessory = UITableViewCellAccessory.Checkmark;
        }

        public override void RowDeselected(UITableView tableView, NSIndexPath indexPath)
        {
            var cell = tableView.CellAt(indexPath);
            if (cell != null) cell.Accessory = UITableViewCellAccessory.None;
        }
    }

    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
    {
        base.OnElementChanged(e);
        if (Control?.Delegate == null)
        {
            Control.Delegate = new CheckedUITableViewDelegate();
        }
    }
}
公共类CheckedListViewRenderer:ListViewRenderer
{
类CheckedUITableViewDelegate:UITableViewDelegate
{
public override void RowSelected(UITableView tableView,NSIndexPath indexPath)
{
var cell=tableView.CellAt(indexPath);
cell.accessority=UITableViewCellAccessority.Checkmark;
}
取消选择公共覆盖无效行(UITableView tableView,NSIndexPath indexPath)
{
var cell=tableView.CellAt(indexPath);
如果(cell!=null)cell.Accessory=UITableViewCellAccessory.None;
}
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控制?.Delegate==null)
{
Control.Delegate=新的checkedEduitableViewDelegate();
}
}
}

注意:
附件视图的这种选择方法既不考虑滚动出视图的选定单元格,也不考虑单元格循环。选择和取消选择后,您需要维护一个辅助数据源来处理这三个项目…

这对我不起作用,因为我的项目中有许多自定义列表视图控件,其中包含网格等,因此转换失败,我无法使用。我想我必须找到其他方法。@newbiios对于需要切换
复选标记的情况,您始终可以为
ListView
子类化,并仅为该渲染器注册自定义渲染器。我得到了此异常系统。InvalidCastException:指定的强制转换无效。在Xamarin.Forms.Platform.iOS.CellTableViewCell.GetNativeCell(UIKit.UITableView tableView,Xamarin.Forms.Cell,System.Boolean recycleCells,System.String templateId)[0x0000c]中的C:\BuildAgent\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Cells\CellTableViewCell.cs:50在Xamarin.Forms.Platform.iOS.TableViewModelRenderer.GetCell中(UIKIT.UITababVIEW TabLVIEW,NosixDestPosithNoxPATH)
public class CheckedListViewRenderer : ListViewRenderer
{
    class CheckedUITableViewDelegate : UITableViewDelegate
    {
        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
            var cell = tableView.CellAt(indexPath);
            cell.Accessory = UITableViewCellAccessory.Checkmark;
        }

        public override void RowDeselected(UITableView tableView, NSIndexPath indexPath)
        {
            var cell = tableView.CellAt(indexPath);
            if (cell != null) cell.Accessory = UITableViewCellAccessory.None;
        }
    }

    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
    {
        base.OnElementChanged(e);
        if (Control?.Delegate == null)
        {
            Control.Delegate = new CheckedUITableViewDelegate();
        }
    }
}