自定义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
相关产品推荐
相关产品推荐

