以编程方式绑定到 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;
}
}
我试图以编程方式将一个名为 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;
}
}