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

Ala*_*an2 5 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我读到了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;

    //...
Run Code Online (Sandbox Code Playgroud)

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

Nko*_*osi 2

我读到,使用 TextCellRenderer 不再需要显式订阅属性更改事件,因为有一个基本的可重写方法 HandlePropertyChanged 可以在此上下文中重复使用。

是的,根据其源代码,这是正确的

protected virtual void HandlePropertyChanged(object sender, PropertyChangedEventArgs args) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

TextCellRenderer 源

有人可以告诉我 ViewCellRenderer 是否也是这种情况,如果是的话,我该如何修改此代码以利用它?

不,情况也不是这样,ViewCellRenderer根据源代码ViewCellRenderer 没有ViewCellPropertyChanged按原样公开它private

void ViewCellPropertyChanged(object sender, PropertyChangedEventArgs e) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

ViewCellRenderer 源

您始终可以自己修改它并创建拉取请求来添加该功能。