【问题标题】:How to handle override rowselected event in custom render xamarin forms如何处理自定义渲染器 xamarin 表单中的覆盖行选择事件
【发布时间】:2017-04-25 20:03:33
【问题描述】:

我想在自定义渲染器中覆盖以下方法。我想要做的就是在选择和取消选择时显示或隐藏复选标记。

public override void RowSelected (UITableView tableView, NSIndexPath   indexPath)
{
 // Do something
}

自定义渲染器代码如下

 public class StandardViewCellRenderer : ViewCellRenderer
 {
    public override UIKit.UITableViewCell GetCell(Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv)
    {
        var cell = base.GetCell(item, reusableCell, tv);
        switch (item.StyleId)
        {
            case "checkmark":
                cell.Accessory = UIKit.UITableViewCellAccessory.Checkmark;
                break;
            default:
                cell.Accessory = UIKit.UITableViewCellAccessory.DisclosureIndicator;
                break;
        }
        return cell;
    }

我想做类似下面的事情。我应该重写什么方法来实现这一点。

    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;
     }


}

如何做到这一点?

【问题讨论】:

    标签: xamarin xamarin.ios xamarin.android xamarin.forms


    【解决方案1】:

    最简单的方法是在自定义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();
            }
        }
    }
    

    注意:

    附件视图的这种选择方法没有考虑选中单元格滚动出视图,多选,也没有考虑单元格回收。您需要在选择和取消选择时维护一个辅助数据源来处理这三个项目...

    【讨论】:

    • 这对我不起作用,因为我的项目中有许多自定义列表视图控件,其中包含网格等。因此转换失败,我无法使用。我想我必须找到其他方法。
    • @NewbieIOS 对于需要切换Checkmark 并仅为该渲染器注册自定义渲染器的情况,您始终可以将ListView 子类化。
    • 我收到了这个异常 System.InvalidCastException: Specified cast is not valid。在 C:\BuildAgent\work\ca3766cfc22354a1\Xamarin 中的 Xamarin.Forms.Platform.iOS.CellTableViewCell.GetNativeCell(UIKit.UITableView tableView、Xamarin.Forms.Cell 单元格、System.Boolean recycleCells、System.String templateId)[0x0000c]。 Forms.Platform.iOS\Cells\CellTableViewCell.cs:50 在 Xamarin.Forms.Platform.iOS.TableViewModelRenderer.GetCell (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多