Xamarin 如何获取自定义表节页脚以响应动态更改?

Xamarin 如何获取自定义表节页脚以响应动态更改?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在使用以下代码: public class ExtFooterTableViewRenderer : TableViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<TableView> e) { base.OnElementChanged(e); if (Control == null) retur

我正在使用以下代码:

public class ExtFooterTableViewRenderer : TableViewRenderer
{


    protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
    {
        base.OnElementChanged(e);
        if (Control == null)
            return;

        var tableView = Control as UITableView;
        var formsTableView = Element as TableView;
        tableView.WeakDelegate = new CustomFooterTableViewModelRenderer(formsTableView);
    }

    private class CustomFooterTableViewModelRenderer : TableViewModelRenderer
    {
        public CustomFooterTableViewModelRenderer(TableView model) : base(model)
        {
        }

        public override UIView GetViewForFooter(UITableView tableView, nint section)
        {
            var txtView = new UITextView
            {
                //Text = "Select or deselect cards from the list above and they will added or removed from the card deck,",
                Text = TitleForFooter(tableView, section),
                TextColor = UIColor.Gray,
                TextAlignment = UITextAlignment.Justified,
                TextContainerInset = new UIEdgeInsets(top: 10, left: 15, bottom: 5, right: 15),
                BackgroundColor = Color.Transparent.ToUIColor()
            };

            txtView.TextContainer.LineBreakMode = UILineBreakMode.WordWrap;
            return txtView;
        }

        //Retrieves the footer text for corresponding section through the attached property
        public override string TitleForFooter(UITableView tableView, nint section)
        {
            var tblSection = View.Root[(int)section];
            return ExtFooterTableView.GetFooterText(tblSection);
        }
    }
}
在XAML中更改页脚效果很好,如下所示:

<TableSection Title="Cards" local:ExtFooterTableView.FooterText="ABC">
<TableSection Title="Cards" local:ExtFooterTableView.FooterText="{Binding CardsFooter}">
但当我尝试这样绑定时:

<TableSection Title="Cards" local:ExtFooterTableView.FooterText="ABC">
<TableSection Title="Cards" local:ExtFooterTableView.FooterText="{Binding CardsFooter}">
然后,它似乎不响应在我的代码后端C中对CardsFooter的值所做的更改


是否有一种方法可以使其响应绑定值的动态更改,从而显示更改?

即使在附加属性的情况下,也会在相应的可绑定对象中调用PropertyChanged事件

为了收听这些更改,您可以订阅这些更改,并相应地更新/重新加载其本机对应部分:

private class CustomFooterTableViewModelRenderer : TableViewModelRenderer
{
    public CustomFooterTableViewModelRenderer(TableView model) : base(model)
    {
    }

    public override UIView GetViewForFooter(UITableView tableView, nint section)
    {
        ....
    }

    //Retrieves the footer text for corresponding section through the attached property
    public override string TitleForFooter(UITableView tableView, nint section)
    {
        var tblSection = View.Root[(int)section];

        Table = tableView;
        tblSection.PropertyChanged -= OnSectionPropertyChanged;
        tblSection.PropertyChanged += OnSectionPropertyChanged;

        return ExtFooterTableView.GetFooterText(tblSection);
    }

    void OnSectionPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (ExtFooterTableView.FooterTextProperty.PropertyName.Equals(e.PropertyName))
        {
            if (sender is TableSection section)
            {
                var index = View.Root.IndexOf(section);
                var indexSet = Foundation.NSIndexSet.FromIndex(index);
                Table.ReloadSections(indexSet, UITableViewRowAnimation.None);
            }
        }
    }

    //Also ensure unsubscribe during dispose, or unload
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        foreach(var section in View?.Root)
            section.PropertyChanged -= OnSectionPropertyChanged;
    }
}
此外,建议您在表视图呈现程序中的OnElementChanged中为元素添加空检查:

protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
{
    base.OnElementChanged(e);
    if (Control == null || Element == null)
        return;

即使在附加属性的情况下,也会在相应的可绑定对象中调用PropertyChanged事件

为了收听这些更改,您可以订阅这些更改,并相应地更新/重新加载其本机对应部分:

private class CustomFooterTableViewModelRenderer : TableViewModelRenderer
{
    public CustomFooterTableViewModelRenderer(TableView model) : base(model)
    {
    }

    public override UIView GetViewForFooter(UITableView tableView, nint section)
    {
        ....
    }

    //Retrieves the footer text for corresponding section through the attached property
    public override string TitleForFooter(UITableView tableView, nint section)
    {
        var tblSection = View.Root[(int)section];

        Table = tableView;
        tblSection.PropertyChanged -= OnSectionPropertyChanged;
        tblSection.PropertyChanged += OnSectionPropertyChanged;

        return ExtFooterTableView.GetFooterText(tblSection);
    }

    void OnSectionPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (ExtFooterTableView.FooterTextProperty.PropertyName.Equals(e.PropertyName))
        {
            if (sender is TableSection section)
            {
                var index = View.Root.IndexOf(section);
                var indexSet = Foundation.NSIndexSet.FromIndex(index);
                Table.ReloadSections(indexSet, UITableViewRowAnimation.None);
            }
        }
    }

    //Also ensure unsubscribe during dispose, or unload
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        foreach(var section in View?.Root)
            section.PropertyChanged -= OnSectionPropertyChanged;
    }
}
此外,建议您在表视图呈现程序中的OnElementChanged中为元素添加空检查:

protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
{
    base.OnElementChanged(e);
    if (Control == null || Element == null)
        return;