C# Xamarin Forms 初始化时自定义按钮TextChanged事件未触发问题
问题根因
Xamarin.Forms 绑定系统对依赖属性的赋值会直接调用SetValue方法操作底层的BindableProperty,不会走CLR包装属性的setter,所以你自定义重写的Text属性的setter在绑定初始化时不会被触发,TextChanged事件自然不会抛出。同时你的行为类在附加到按钮时没有校验初始文本状态,也是初始化样式不生效的原因之一。
修改方案
1. 修正CButton实现
移除重复的Text属性重写,改用依赖属性变更回调监听Text变化,兼容绑定赋值和手动赋值两种场景:
public class CButton : Button { public CButton() { // 监听原生Text依赖属性的全局变更 TextProperty.PropertyChanged += (sender, args) => { if (sender is CButton btn) { TextChanged?.Invoke(btn, EventArgs.Empty); } }; } public event EventHandler<EventArgs> TextChanged; }
2. 修正行为类逻辑
附加到按钮时主动校验一次初始文本状态,保证初始化样式正确,同时修正原逻辑中边框颜色写反的问题:
public class ButtonValBehavior : Behavior<CButton> { protected override void OnAttachedTo(CButton bindable) { base.OnAttachedTo(bindable); bindable.TextChanged += HandleTextChanged; // 初始化主动触发一次校验 HandleTextChanged(bindable, EventArgs.Empty); } void HandleTextChanged(object sender, EventArgs e) { var btn = sender as CButton; string forbidden = "hh:mm|dd.mm.yyyy"; // 符合需求的逻辑:提示文本时显示红色边框,选中值后移除红框 if (forbidden.Contains(btn.Text.ToLower())) { btn.BorderColor = Color.FromHex("#d10f32"); } else { btn.BorderColor = Color.Gray; } } protected override void OnDetachingFrom(CButton bindable) { base.OnDetachingFrom(bindable); bindable.TextChanged -= HandleTextChanged; } }
3. 补充XAML配置
Xamarin.Forms的Button默认边框宽度为0,需要显式设置BorderWidth才能让边框生效:
<b:CButton x:Name="BTN_ED_Datum" Text="{Binding Base.ED_datum, Mode=TwoWay}" Grid.Column="1" Command="{Binding DatePopCommand}" CommandParameter="{x:Reference BTN_ED_Datum}" BorderWidth="1"> <!-- 新增边框宽度配置 --> <b:CButton.Behaviors> <b:ButtonValBehavior/> </b:CButton.Behaviors> </b:CButton>
内容的提问来源于stack exchange,提问作者owe
相关产品推荐
相关产品推荐

