自定义数值输入控件绑定异常:Max更新时IsEnabled/Opacity未同步
自定义步进数值输入控件Max属性更新时绑定失效问题
我开发了一款带步进器的自定义数值输入控件,除一处属性绑定问题外,其余功能均正常。控件增减按钮的IsEnabled和Opacity属性已完成绑定,逻辑为:当Value属性大于Min或小于Max时,对应按钮可点击。
存在的问题:仅当**Max属性单独更新(而非Value属性更新)**时,按钮的绑定逻辑无法按预期生效。该控件部分场景下需作为集合对象的输入组件使用。
问题核心:按钮的绑定仅监听了Value属性的变更,但绑定逻辑中同时依赖Max属性,导致Max单独更新时绑定不会触发更新。
以下是增量按钮相关的代码及属性:
public double? Value { get { return (double?)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static readonly BindableProperty ValueProperty = BindableProperty.Create(nameof(Value), typeof(double?), typeof(Nu), null); public double? Max { get { return (double?)GetValue(MaxProperty); } set { SetValue(MaxProperty, value); } } public static readonly BindableProperty MaxProperty = BindableProperty.Create(nameof(Max), typeof(double?), typeof(NumericEntry), null); public event EventHandler Tapped; new PancakeView (true, 0) // This is tappable, it increments 'Value' by one { Content = new FontAwesome { Text = "\u002b", // Plus Symbol }.Bind(OpacityProperty, nameof(Value), source: this, convert: (double? d) => Max == null || (d.HasValue && d.Value < Max) ? 1 : .25) .CenterExpand() }.Bind(IsEnabledProperty, nameof(Value), source: this, convert: (double? d) => Max == null || (d.HasValue && d.Value < Max)) .Invoke(pv => pv.TapEvent += Increment_Tapped) private void Increment_Tapped(object s, EventArgs e) { PancakeView pv = s as PancakeView; OnStepperPress(pv); if (Value == null) { Value = 0; } if (Value < Max || Max == null) { Value += 1; } OnSubmitTap(s, e); } private void OnSubmitTap(object sender, EventArgs e) { Tapped?.Invoke(this, e); }
更新说明(解决方案)
通过在BindableProperty的属性变更回调方法中触发PropertyChanged,已解决该问题(参考Liqun Shen的回答)。
同时感谢@Jason提供的相同方案,此前方案未生效的原因是添加到ObservableCollection的初始对象未实例化Value或Max属性。
内容的提问来源于stack exchange,提问作者chiken nuget
相关产品推荐
相关产品推荐

