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

自定义CtrlImageToggleButton绑定IsChecked时出现XFC0009错误求助

问题原因及修复方案

核心错误点

  • BindableProperty命名与参数错误:你定义的BindableProperty命名为IsCheckedProPerty(拼写错误,正确应为IsCheckedProperty),且propertyName参数传入了错误的名称"IsCheckedProPerty",而正确的属性名是IsChecked,这导致XAML无法识别绑定的属性。
  • CLR属性实现错误:你的CLR属性IsChecked直接操作私有字段bCheck,没有通过GetValue/SetValue与BindableProperty关联,违背了BindableProperty的工作机制;同时set方法中调用SetValue会触发propertyChanged回调,回调里又给IsChecked赋值,形成循环调用。

修复后的完整代码

自定义控件代码

public class CtrlImageToggleButton : ImageButton
{
    public delegate void eStatusChanged();
    public event eStatusChanged event_StatusChanged;
               
    public bool IsChecked 
    {
        get => (bool)GetValue(IsCheckedProperty);
        set => SetValue(IsCheckedProperty, value);
    }

    public static readonly BindableProperty IsCheckedProperty = BindableProperty.Create(
        propertyName: nameof(IsChecked),
        returnType: typeof(bool),
        declaringType: typeof(CtrlImageToggleButton),
        defaultValue: false,
        defaultBindingMode: BindingMode.TwoWay,
        propertyChanged: IsCheckedPropertyChanged);

    private static void IsCheckedPropertyChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var toggleBtn = bindable as CtrlImageToggleButton;
        if (toggleBtn == null) return;
        
        // 触发状态变更事件
        toggleBtn.event_StatusChanged?.Invoke();
        
        // 根据状态切换图片
        toggleBtn.ImageSource = (bool)newValue ? toggleBtn.ToggleOnImageSource : toggleBtn.ToggleOffImageSource;
    }

    // 补充ToggleOn/OffImageSource的BindableProperty
    public ImageSource ToggleOnImageSource
    {
        get => (ImageSource)GetValue(ToggleOnImageSourceProperty);
        set => SetValue(ToggleOnImageSourceProperty, value);
    }

    public static readonly BindableProperty ToggleOnImageSourceProperty = BindableProperty.Create(
        nameof(ToggleOnImageSource),
        typeof(ImageSource),
        typeof(CtrlImageToggleButton));

    public ImageSource ToggleOffImageSource
    {
        get => (ImageSource)GetValue(ToggleOffImageSourceProperty);
        set => SetValue(ToggleOffImageSourceProperty, value);
    }

    public static readonly BindableProperty ToggleOffImageSourceProperty = BindableProperty.Create(
        nameof(ToggleOffImageSource),
        typeof(ImageSource),
        typeof(CtrlImageToggleButton));

    // 点击时自动切换状态
    public CtrlImageToggleButton()
    {
        Clicked += (s, e) => IsChecked = !IsChecked;
    }
}

XAML使用(保持原代码即可)

<Ctrl:CtrlImageToggleButton
    x:Name="xEnablePV"
    Grid.Row="7"
    Grid.Column="1"
    HorizontalOptions="Start"
    IsChecked="{Binding EnablePV}"
    ToggleOffImageSource="btn_off.png"
    ToggleOnImageSource="btn_on.png" />

关键修复说明

  • BindableProperty命名规范:严格遵循[属性名]Property的命名规则,用nameof(IsChecked)传入propertyName参数,避免硬编码错误。
  • CLR属性正确实现:直接通过GetValue和SetValue与BindableProperty交互,无需私有字段存储值,BindableProperty会自动管理属性值。
  • 避免循环调用:propertyChanged回调中不再给IsChecked赋值,只处理状态变更后的逻辑(如切换图片、触发事件)。
  • 补充必要的BindableProperty:为ToggleOnImageSource和ToggleOffImageSource添加BindableProperty,确保XAML绑定正常工作。
  • 添加点击切换逻辑:在构造函数中绑定Clicked事件,点击时自动切换IsChecked状态,符合ToggleButton的预期行为。

内容的提问来源于stack exchange,提问作者user19432624

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:45:42