You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:45:04