以编程方式绑定到 syncfusion NeedPointer

Binding programmatically to a syncfusion NeedPointer

我试图以编程方式将一个名为 PointerValue 的 属性 绑定到一个 NeedlePointer.Value,但没有成功,但似乎在某处丢失了。

xamarin 应用程序基本上有一个仪表和一个开始按钮,当按下开始按钮时我启动计时器。计时器结束后,指针值应增加 on。在 XAML 中很容易,但无法弄清楚如何将其转换为代码 <gauge:NeedlePointer Value="{Binding PointerValue}"

public class StopWatchPage : BaseContentPage
{
    private Timer timer;

    private double PointerValue
    {
        get => (double)GetValue(PointerValueProperty);
        set => SetValue(PointerValueProperty, value);
    }

    private static readonly BindableProperty PointerValueProperty =
        BindableProperty.Create("PointerValue", 
           typeof(double), typeof(StopWatchPage), 0d);

    public StopWatchPage()
    {
        this.BindingContext = this;

        var needlePointer = new NeedlePointer
        {
            Value = PointerValue
        };
        needlePointer.SetBinding(
            PointerValueProperty, nameof(PointerValue));

        var scale = new Scale{...};
        scale.Pointers.Add(needlePointer);
        scales.Add(scale);
        circularGauge.Scales = scales;

        ... add gauge to Content etc...
    }

    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        this.PointerValue += 1;
    }
}

这应该可行,尽管 ValueProperty 的实际名称可能因 NeedlePointer 的实施方式而异。第一个参数是您要绑定到(目标)的控件的名称 属性,第二个参数是作为源的值 属性 的名称。

needlePointer.SetBinding(NeedlePointer.ValueProperty, "PointerValue");

但是,如果您希望 UI 动态更新,您还需要让 BindingContext 实现 INotifyPropertyChanged

无需创建 BindableProperty

解决方案感谢@Jason 指出我需要一个实现 INotifyPropertyChanged 的模型,因此代码更改为

public class StopWatchViewModel : INotifyPropertyChanged
{
    public double PointerValue { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class StopWatchPage : BaseContentPage
{
    private Timer timer;
    private readonly StopWatchViewModel model = new StopWatchViewModel();

    public StopWatchPage()
    {
        BindingContext = model;
        ...
        needlePointer.SetBinding(NeedlePointer.ValueProperty, 
          nameof(model.PointerValue));
        ...
    }

    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        model.PointerValue += 1;
    }
}