如何在XAML中通过x:Name将整个对象绑定至另一对象属性?
嘿,我明白你想通过x:Name实现两种可能的需求——要么把目标对象本身绑定到另一个控件的属性,要么把x:Name的字符串值绑定过去。看了你贴的代码,问题出在绑定逻辑上,我分两种情况给你捋清楚:
情况1:把整个对象(比如starOne)绑定到属性上
如果你的starTag属性类型就是StarBehavior,那根本不需要绕弯子设置BindingContext,直接用x:Reference就能直接引用整个对象:
<local:StarBehavior x:Name="starOne" GroupName="myStar"/> <local:StarImage starTag="{x:Reference starOne}" x:Name="starBlankOne" Source="rating-stars/star_outline.png"/>
这样starBlankOne的starTag就会直接指向starOne这个实例,完美实现“通过x:Name绑定整个对象”的需求。
情况2:把x:Name的字符串值(比如"starOne")绑定到属性上
这里要注意:x:Name是XAML的标记扩展,它只会给继承自FrameworkElement的UI控件自动设置Name属性。如果你的StarBehavior是行为类(比如Xamarin的Behavior或者自定义非UI类),它本身没有Name属性,所以{Binding Name}自然找不到对应的属性,绑定就失效了。
解决这个问题有两种简单方法:
- 给
StarBehavior添加Name可绑定属性:
先在你的StarBehavior类里加一个Name属性:
然后在XAML里同时设置public class StarBehavior : Behavior<VisualElement> // 假设是Xamarin Behavior,根据你的实际基类调整 { public static readonly BindableProperty NameProperty = BindableProperty.Create(nameof(Name), typeof(string), typeof(StarBehavior), null); public string Name { get => (string)GetValue(NameProperty); set => SetValue(NameProperty, value); } // 你原有的其他代码... }x:Name和Name(保持两者一致即可):<local:StarBehavior x:Name="starOne" Name="starOne" GroupName="myStar"/> <local:StarImage BindingContext="{x:Reference starOne}" starTag="{Binding Name}" x:Name="starBlankOne" Source="rating-stars/star_outline.png"/> - 直接硬编码字符串:
既然x:Name是你自己写的固定值,也可以直接把字符串赋值给starTag,省去绑定的麻烦:<local:StarBehavior x:Name="starOne" GroupName="myStar"/> <local:StarImage starTag="starOne" x:Name="starBlankOne" Source="rating-stars/star_outline.png"/>
如果是在WPF环境下,只要StarBehavior是FrameworkElement子类,那x:Name会自动同步到Name属性,直接用{Binding Name}就生效,但行为类一般都不是,所以还是得用上面的方法~
内容的提问来源于stack exchange,提问作者Samuel Mungy
相关产品推荐
相关产品推荐

