我正在使用此代码:
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}">
然后它似乎没有响应在我的代码后端C#中创建的CardsFooter值的变化。
有没有办法让我能够对绑定值中的动态变化做出响应,以便它出现更改?
答案 0 :(得分:2)
即使在附加属性的情况下 - 在相应的可绑定对象中调用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;
}
}
此外,建议您在表格视图渲染器的Element
中为OnElementChanged
添加空检查:
protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
{
base.OnElementChanged(e);
if (Control == null || Element == null)
return;