如何为引用的自定义ContentView(XAML)绑定值?圆形头像控件绑定值为null的问题求助
嘿,我发现你这个问题的根源啦!
你在CircleView的构造函数里写了BindingContext = this;,这直接把控件的绑定上下文给替换成自身了——原本这个上下文应该是从HomePage传过来的、包含Initials属性的那个ViewModel呀!所以CircleText="{Binding Initials}"根本拿不到值,自然显示null了。
另外,CircleView里的Label绑定也得跟着调整,不然就算修复了上下文,也可能绑不对地方。
下面给你两种解决办法,选哪种都可以,我更推荐第一种,更符合自定义控件的最佳实践:
方法一:移除手动设置的BindingContext,用RelativeSource绑定Label
这种方法让控件继承父页面的绑定上下文,保证CircleText能正常拿到Initials的值,同时Label通过RelativeSource绑定到控件自身的CircleText属性:
先改CircleView.xaml.cs
把构造函数里的BindingContext = this;删掉就行:
public partial class CircleView : ContentView { public CircleView() { InitializeComponent(); // 删掉这行:BindingContext = this; } public static readonly BindableProperty CircleTextProperty = BindableProperty.Create(nameof(CircleText), typeof(string), typeof(CircleView), null); public string CircleText { get { return (string)GetValue(CircleTextProperty); } set { SetValue(CircleTextProperty, value); } } }
再改CircleView.xaml
给Label的Text绑定加上RelativeSource,让它找到当前的CircleView:
<Frame x:Name="circleFrame"> <Label x:Name="circleLabel" Text="{Binding CircleText, RelativeSource={RelativeSource AncestorType={x:Type views:CircleView}}}"/> </Frame>
方法二:保留BindingContext=this,调整HomePage的绑定
如果你就是想让CircleView的绑定上下文指向自己,那得在HomePage里明确指定绑定的来源:
假设你的HomePage的BindingContext是包含Initials的ViewModel,那么把HomePage里的绑定改成这样:
<views:CircleView CircleText="{Binding Initials, RelativeSource={RelativeSource AncestorType={x:Type views:HomePage}}}"/>
要是你的HomePage有名字(比如x:Name="MyHomePage"),也可以这么写:
<views:CircleView CircleText="{Binding Initials, Source={x:Reference MyHomePage}}"/>
这种情况下,CircleView构造函数里的BindingContext = this;可以留着,Label的Text="{Binding CircleText}"也能正常工作,因为此时上下文是控件自己。
我个人更推荐第一种方法,这样你的自定义控件在任何页面里使用都更灵活,不用每次都调整绑定源~
内容的提问来源于stack exchange,提问作者steve

