Программная привязка к syncfusion NeedPointer - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь безуспешно связать свойство, называемое PointerValue, с NeedlePointer.Value программно, но, кажется, что-то потеряно.

Приложение xamarin в основном имеет датчик и кнопку запуска при запускенажата кнопка запускаю таймер. По истечении таймера значение стрелки должно увеличиться на. Легко в 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;
    }
}

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

это должно работать, хотя фактическое имя ValueProperty может отличаться в зависимости от того, как реализовано NeedlePointer. Первый аргумент - это имя свойства элемента управления, к которому вы привязываете (цель), а второй - имя свойства значения, действующего как источник.

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

однако, если вы хотитеДля динамического обновления пользовательского интерфейса вам также понадобится BindingContext инструмент INotifyPropertyChanged

Нет необходимости создавать BindableProperty

0 голосов
/ 01 ноября 2019

Решение благодаря @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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...