现在,我不再需要显式订阅property-changed-event,是否可以简化此iOS渲染器

时间:2017-11-13 14:07:21

标签: c# xamarin xamarin.forms

我正在使用此自定义渲染器:

public class ExtViewCellRenderer : ViewCellRenderer
{
    UITableViewCell _nativeCell;

    public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
    {
        _nativeCell = base.GetCell(item, reusableCell, tv);
        var formsCell = item as ExtViewCell;

        if (formsCell != null)
        {
            formsCell.PropertyChanged -= OnPropertyChanged;
            formsCell.PropertyChanged += OnPropertyChanged;
        }
        SetTap(formsCell);

        return _nativeCell;
    }

    void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        var formsCell = sender as ExtViewCell;
        if (formsCell == null)
            return;

        if (e.PropertyName == ExtViewCell.NoTapProperty.PropertyName)
        {
            SetTap(formsCell);
        }
    }

    private void SetTap(ExtViewCell formsCell)
    {
        if (formsCell.NoTap)
            _nativeCell.SelectionStyle = UITableViewCellSelectionStyle.None;
        else
            _nativeCell.SelectionStyle = UITableViewCellSelectionStyle.Default;
    }

}

我用TextCellRenderer读取它不再需要显式订阅property-changed-event,因为有一个可在此上下文中重用的基本可覆盖方法HandlePropertyChanged

有人可以告诉我,ViewCellRenderer是否也是这种情况,如果是,那么我怎么能修改这段代码才能使用它呢?

我还在另一个渲染器中看到了这样的代码:

public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
    var textCell = (TextCell)item;
    var fullName = item.GetType().FullName;
    cell = tv.DequeueReusableCell(fullName) as CellTableViewCell;

    //...

但不是在这里。是否有必要这样做Cell = tv.DequeueReusableCell

1 个答案:

答案 0 :(得分:2)

  

我读到使用TextCellRenderer时,不再需要显式订阅property-changed-event,因为有一个可在此上下文中重用的基本可覆盖方法HandlePropertyChanged。

根据其源代码

,这是正确的
protected virtual void HandlePropertyChanged(object sender, PropertyChangedEventArgs args) {
    //...
}

TextCellRenderer Source

  

有人可以告诉我ViewCellRenderer的情况是否也是如此,如果是的话,我怎么能修改这段代码才能使用它呢?

不是ViewCellRenderer的情况也不是这样,因为根据源代码ViewCellRenderer未公开其ViewCellPropertyChanged,因为它是private

void ViewCellPropertyChanged(object sender, PropertyChangedEventArgs e) {
    //...
}

ViewCellRenderer Source

您可以随时自行修改并创建拉取请求以添加该功能。